2011-09-13 5 views
6

tapply(または他の方法、plyrなど)を使用して複数の関数を同じ列に適用する方法を指摘してください。たとえば、データフレームがある場合、tapplyを使用して列に複数の関数を適用する

User MoneySpent 
Joe  20 
Ron  10 
Joe  30 
... 

私はMoneySpent + Occurencesの合計として結果を取得したいと考えています。

私のような機能を使用 -

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

あなたは確かにplyrパッケージからddplyを使用して、このようなものを行うことができます。

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 

あなたが好きな場合は、ちょうど2つを超えて、より多くの要約機能をリストアップしておくことができます。注:内部変数ddplyNROWpieceと呼ぶときは少し難しいです。あなたはちょうどlength(y)のような何かをしたかもしれません。

+0

優れたソリューション!ありがとう – xbsd

+0

私はplyrについてもっと読むことができるリソースを知っていますか? CRANのpdfには、使用に関する情報が非常に限られています。 – xbsd

+0

@xbsd - おそらく最も包括的な情報源の1つは、 'plyr'タグの下か、単に' plyr'をRタグで検索することです。http://stackoverflow.com/search?q= [ r] + plyr – Chase

4

ddply()は概念的に最も明確であり、(そしておそらく必要があります。。私は、ちょうどlength()を使用しないように、私が言うようですか、私は考えて、内部変数pieceは、将来のバージョンで動作することが保証されていない参照)、時にはスピードの理由で代わりにtapplyを使用すると便利です。その場合は次のように動作します:

do.call(rbind, tapply(df$MoneySpent, df$User, f)) 
関連する問題