有人可以指出我们如何使用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
提前致谢,
拉吉
答案 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) )