Совокупность нескольких строк одного и того же data.frame в R на основе общих значений в данных столбцах

У меня есть 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. Однако для одного и того же item может быть несколько value.

Я хочу свернуть data.frame, чтобы иметь одну строку за item, используя средний value:

  item size weight value
1    A    2      3     5
3    B    1      2     3
4    C    3      2     1

Я предполагаю, что мне нужно использовать функцию aggregate, но я не мог понять, как именно я могу получить вышеприведенный результат.

Ответ 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

Ответ 2

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

Решение 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

Вот решение, использующее ddply из пакета 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

Ответ 5

В настоящее время это то, что я сделал бы:

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 наиболее читаемым.