Агрегирование значения одной переменной для каждого класса и каждого идентификатора

У меня есть следующий фрейм данных:

id <- c(1,1,1,1,1,2,2,2,2)
spent <- c(10,10,20,10,10,5,5,5,20)
period <- c("f","c","c","v","v","f","c","c","v")
mean.spent <- c(10,15,15,10,10,5,5,5,20)
df <- data.frame(id,spent,period,mean.spent)

я хочу агрегировать среднее значение, потраченное на каждый идентификатор в каждом периоде, следующим образом:

id  f  c  v    
1   10 15 10
2   5  5  20

Не могли бы вы помочь мне сделать это?


person AliCivil    schedule 28.12.2012    source источник
comment
@Arun предложенное вами редактирование - это решение. Пожалуйста, не делай этого   -  person Cole Johnson    schedule 28.12.2012
comment
@ColeJohnson, я не согласен. Редактирование Аруна просто помогает другим копировать и вставлять предоставленный код в сеанс R для дальнейшей работы над получением желаемого результата.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 28.12.2012
comment
@Ананда хорошо, но обычно не рекомендуется редактировать код ОП.   -  person Cole Johnson    schedule 29.12.2012


Ответы (1)


Используйте xtabs() вместе с aggregate() следующим образом:

df <- data.frame(id = c(1,1,1,1,1,2,2,2,2),
                 spent = c(10,10,20,10,10,5,5,5,20),
                 period = c("f","c","c","v","v","f","c","c","v"),
                 mean.spent = c(10,15,15,10,10,5,5,5,20))

xtabs(spent ~ id + period, aggregate(spent ~ id + period, df, mean))
#    period
# id   c  f  v
#   1 15 10 10
#   2  5  5 20

aggregate вычисляет среднее значение для группы (сгруппированное по "идентификатору" и "периоду"), а xtabs выполняет преобразование в этот более широкий формат.

Вот как превратить его в data.frame:

temp1 <- xtabs(spent ~ id + period, 
               aggregate(spent ~ id + period, df, mean))
data.frame(id = dimnames(temp1)$id, as.data.frame.matrix(temp1))
#   id  c  f  v
# 1  1 15 10 10
# 2  2  5  5 20

Обновление: более прямой подход

Я всегда забываю о tapply, но этот пример — хороший кандидат, когда он удобен.

tapply(df$spent, list(df$id, df$period), mean)
#    c  f  v
# 1 15 10 10
# 2  5  5 20
person A5C1D2H2I1M1N2O1R2T1    schedule 28.12.2012
comment
Спасибо, но могу ли я сделать это фреймворком данных? - person AliCivil; 28.12.2012
comment
@AliTamaddoni, конечно. Просто оберните xtabs с помощью as.data.frame.matrix(). Идентификатор будет row.names, поэтому вам придется добавить их обратно, если вы хотите, чтобы они были столбцами. - person A5C1D2H2I1M1N2O1R2T1; 28.12.2012
comment
@AliTamaddoni, я добавил, как преобразовать его в data.frame, как часть ответа. - person A5C1D2H2I1M1N2O1R2T1; 28.12.2012
comment
@Арун, почему ты удалил свой ответ? Я как раз собирался проголосовать за более прямой подход к temp1 -- В любом случае, смотрите мое обновление.... - person A5C1D2H2I1M1N2O1R2T1; 28.12.2012