13

我有一个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. 但是,同一个 s 可以有多个values 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功能,但我无法弄清楚我如何才能获得上述结果。

4

5 回答 5

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
于 2013-08-14T09:54:14.750 回答
5

这是使用ddplyfrom plyr 包的解决方案:

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
于 2013-08-14T12:22:22.527 回答
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
于 2013-08-14T10:09:21.260 回答
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
于 2013-08-14T09:52:39.130 回答
3

如今,这就是我要做的:

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

于 2017-10-16T11:29:52.080 回答