2011-09-13 30 views
6

有人可以指出我們如何使用tapply(或任何其他方法,plyr等)將多個函數應用於同一列,以便可以在不同的列中獲得結果)。對於例如,如果我有使用tapply對列應用多個函數

User MoneySpent 
Joe  20 
Ron  10 
Joe  30 
... 

一個數據幀我想要得到的結果作爲OCCURENCES的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 

感謝,

  • 拉吉。

回答

8

你當然可以做這樣的東西用ddplyplyr包:

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 

你可以把更多的上市彙總函數,不僅僅是二,如果你喜歡。請注意我在這裏調用NROWddply內部變量piece有點棘手。您可以改爲像length(y)那樣做。 (並且可能應該;引用內部變量piece不能保證在未來版本中的工作,我想,照我說的,不是像我一樣,只是使用length()。)

+0

優秀的解決方案!謝謝 – xbsd

+0

你知道任何資源,我可以閱讀更多關於plyr。關於CRAN的pdf有非常有限的使用信息。 – xbsd

+0

@xbsd - 可以說是最全面的信息來源之一將在SO上,無論是在「plyr」標籤下還是簡單地用R標籤搜索「plyr」:http://stackoverflow.com/search?q= [ r] + plyr – Chase

4

ddply()在概念上是清晰的,但有時使用tapply代替速度的原因是有用的,在這種情況下,以下工作:

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