根据给定列中的公共值,在R中聚合相同data.frame的多行

时间:2013-08-14 09:43:46

标签: r dataframe aggregate

我的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

正如您所看到的,sizeweight列不会增加任何复杂性,因为每个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函数,但我无法弄清楚我是如何得到上述结果的。

5 个答案:

答案 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解决方案最具可读性。