我的data.frame
看起来像这样:
# 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
正如您所看到的,size
和weight
列不会增加任何复杂性,因为每个item
的列都相同。但是,同一value
可能有多个item
。
我想使用平均值item
将data.frame折叠为每value
行一行:
item size weight value
1 A 2 3 5
3 B 1 2 3
4 C 3 2 1
我想我必须使用aggregate
函数,但我无法弄清楚我是如何得到上述结果的。
答案 0 :(得分:17)
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
答案 1 :(得分:4)
以下是使用plyr包中的ddply
的解决方案:
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
答案 2 :(得分:3)
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
答案 3 :(得分:3)
data.table
解决方案......
require(data.table)
DT <- data.table(df)
DT[ , lapply(.SD , mean ) , by = item ]
item size weight value
1: A 2 3 5
2: B 1 2 3
3: C 3 2 1
答案 4 :(得分:1)
如今,这就是我要做的事情:
require(dplyr)
df %>%
group_by(item, size, weight) %>%
summarize(value = mean(value)) %>%
ungroup
这产生以下结果:
# 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
我将保留已接受的答案,例如我特别要求aggregate
,但我发现dplyr
解决方案最具可读性。