使用tapply将多个函数应用于列

时间:2011-09-13 18:10:25

标签: r

有人可以指出我们如何使用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 个答案:

答案 0 :(得分:9)

您当然可以使用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()并不能保证在将来的版本中起作用,我想。按照我的说法,不要像我一样,只使用{{1}}。)

答案 1 :(得分:5)

ddply()在概念上是最清晰的,但有时候出于速度原因使用tapply会很有用,在这种情况下,以下方法有效:

do.call( rbind, tapply(df$MoneySpent, df$User, f) )