Применить несколько функций к столбцу, используя tapply - PullRequest
6 голосов
/ 13 сентября 2011

Может кто-нибудь указать, как мы можем применить несколько функций к одному и тому же столбцу, используя tapply (или любой другой метод, plyr и т. Д.), Чтобы результат можно было получить в разных столбцах).Например, если у меня есть фрейм данных с

User  MoneySpent
Joe       20
Ron       10
Joe       30
...

, я хочу получить результат как сумму MoneySpent + количество вхождений.

Я использовал такую ​​функцию, как -

f <- function(x) c(sum(x), length(x))
tapply(df$MoneySpent, df$Uer, f)

Но это не разбивает его на столбцы, дает что-то вроде, скажем,

Joe    Joe    100, 5   # The sum=100, number of occurrences = 5, but it gets juxtaposed

Заранее спасибо,

Радж

Ответы [ 2 ]

9 голосов
/ 13 сентября 2011

Вы можете сделать что-то подобное, используя ddply из пакета plyr:

dat <- data.frame(x = rep(letters[1:3],3),y = 1:9)

ddply(dat,.(x),summarise,total = NROW(piece), count = sum(y))
  x total count
1 a     3    12
2 b     3    15
3 c     3    18

Вы можете продолжать перечислять больше сводных функций, кроме двух, если хотите. Заметьте, что я немного усложняюсь при вызове NROW внутренней переменной в ddply с именем piece. Вы могли бы просто сделать что-то вроде length(y) вместо этого. (И, вероятно, следует; ссылка на внутреннюю переменную piece не гарантируется в будущих версиях, я думаю. Делайте, как я говорю, не так, как я, и просто используйте length().)

5 голосов
/ 14 сентября 2011

ddply() концептуально наиболее понятен, но иногда полезно использовать вместо него tapply по соображениям скорости, и в этом случае работает следующее:

do.call( rbind, tapply(df$MoneySpent, df$User, f) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...