I have a data.frame
that looks like this:
# set example data
df <- read.table(textConnection("item\tsize\tweight\tvalue
A\t2\t3\t4
A\t2\t3\t6
B\t1\t2\t3
C\t3\t2\t1
B\t1\t2\t4
B\t1\t2\t2"), header = TRUE)
# print example data
df
item size weight value
1 A 2 3 4
2 A 2 3 6
3 B 1 2 3
4 C 3 2 1
5 B 1 2 4
6 B 1 2 2
As you can see the size
and weight
columns do not add any complexity since they are the same for each item
. However, there can be multiple value
s for the same item
.
I want to collapse the data.frame to have one row per item
using the mean value
:
item size weight value
1 A 2 3 5
3 B 1 2 3
4 C 3 2 1
I guess I have to use the aggregate
function but I could not figure out how exactly I can get the above result.
To merge two data frames (datasets) horizontally, use the merge() function in the R language. To bind or combine rows in R, use the rbind() function. The rbind() stands for row binding.
The process involves two stages. First, collate individual cases of raw data together with a grouping variable. Second, perform which calculation you want on each group of cases.
Data Visualization using R Programming To find the common elements between two columns of an R data frame, we can use intersect function.
Nowadays, this is what I would do:
library(dplyr)
df %>%
group_by(item, size, weight) %>%
summarize(value = mean(value)) %>%
ungroup
This yields the following result:
# A tibble: 3 x 4
item size weight value
<chr> <int> <int> <dbl>
1 A 2 3 5
2 B 1 2 3
3 C 3 2 1
I will leave the accepted answer as such as I specifically asked for aggregate
, but I find the dplyr
solution the most readable.
Here is the solution using the ddply
from plyr package:
library(plyr)
ddply(df,.(item),colwise(mean))
item size weight value
1 A 2 3 5
2 B 1 2 3
3 C 3 2 1
aggregate(value ~ item + size + weight, FUN = mean, data=df)
item size weight value
1 B 1 2 3
2 C 3 2 1
3 A 2 3 5
df$value <- ave(df$value,df$item,FUN=mean)
df[!duplicated(df$item),]
item size weight value
1 A 2 3 5
3 B 1 2 3
4 C 3 2 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With