2013-04-19 3 views
2

Я пытаюсь получить сумму числовой переменной за категориальную переменную (в кадре данных). Я пробовал использовать tapply, но это не занимает целое data.frame.сумма по группам в data.frame

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

> set.seed(667) 
> df <- data.frame(a = sample(c("Group A","Group B","Group C",NA), 10, rep = TRUE), 
        b = sample(c(1, 2, 3, 4, 5, 6), 10, rep=TRUE), 
        c = sample(c(11, 12, 13, 14, 15, 16), 10, rep=TRUE)) 
> df 
      a b c 
1 Group A 4 12 
2 Group B 6 12 
3  <NA> 4 14 
4 Group C 1 16 
5  <NA> 2 14 
6  <NA> 3 13 
7 Group C 4 13 
8  <NA> 6 15 
9 Group B 3 16 
10 Group B 5 16 

с помощью tapply, я могу получить один вектор в то время:

> tapply(df$b,df$a,sum) 
Group A Group B Group C 
     4  14  5  

, но я больше заинтересован в получении что-то вроде этого:

  a b c 
1 Group A 4 12 
2 Group B 14 44 
3 Group C 5 29 

Любая помощь будет оценена по достоинству. Благодарю.

ответ

4

Используйте агрегат вместо:

aggregate(df[ , c("b","c")], df['a'], FUN=sum) 
     a b c 
1 Group A 4 12 
2 Group B 14 44 
3 Group C 5 29 

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

+0

Спасибо. DWin, ты настоящий мастер. –

+1

@ EricFail или вы можете использовать интерфейс формулы с агрегатом (который я просто нахожу лично более интуитивно понятным), чтобы сделать то же самое: 'aggregate (cbind (b, c) ~ a, data = df, sum)' + 1 –

+1

Донча пожелал, чтобы они поддерживали интерфейс формулы, который будет анализировать LHS, чтобы у новичков, подобных нам, не было бы необходимости использовать этот хакерский 'cbind'? –

Смежные вопросы