2013-08-29 2 views
5

集計する条件と値のリストを渡すことで、関数内のどのようにしてaggregateを抽象化しますか?集計をカラム名のリストで使用する方法

# This works fine: 
x <- data.frame(cond1 = sample(letters[1:3], 500, replace=TRUE), 
       cond2 = sample(LETTERS[1:7], 500, replace = TRUE), 
       cond3 = sample(LETTERS[1:4], 500, replace = TRUE), 
       value1 = rnorm(500), 
       value2 = rnorm(500)) 

aggregate(cbind(value1,value2) ~ cond1 + cond2, data = x, FUN=sum) 

列名のリストを作成する必要があります(3つのオプションが示され)、関数を呼び出します。

c1 <- c("cond1","cond2","cond3"); v1 <- c("value1","value2") 
c1 <- c("cond2","cond3");   v1 <- c("value2") 
c1 <- c("cond3");     v1 <- c("value1") 

aggregate(cbind(v1) ~ c1, data = x, FUN=sum) 

私は多くの選択肢を検討しているが、まだこの抽象化の鍵を発見していません。

答えて

8

あなたは式を使用しない、aggregateへの代替インタフェースを使用することができます。

c1 <- c("cond1","cond2","cond3") 
v1 <- c("value1","value2") 
aggregate(x[v1],by=x[c1],FUN=sum) 

    cond1 cond2 cond3  value1  value2 
1  a  A  A -3.3025839 -0.98304649 
2  b  A  A 0.6326985 -3.08677485 
3  c  A  A 3.6007853 2.23962265 
4  a  B  A -0.5247620 -0.94644740 
5  b  B  A 0.9242562 2.48268452 
6  c  B  A 6.9215712 0.31512645 
+0

のリストです!ありがとう、それは完全に動作します! – DouglasM

1
c1 <- list(c("cond1","cond2","cond3"), c("cond2","cond3"),c("cond3")) 
v1 <- list(c("value1","value2"),c("value2"),c("value1")) 

mapply(FUN= function(z,y, ...) {aggregate(x[ , y], by=x[z], ...)}, 
      c1, v1, MoreArgs=list(FUN=sum)) 

結果は、私がまさに必要である3つのデータフレーム

[[1]] 
    cond1 cond2 cond3  value1  value2 
1  a  A  A 0.19396539 1.11536490 
2  b  A  A -1.20056699 -5.36713982 
3  c  A  A -0.19716521 -2.06737461 
4  a  B  A 1.58880450 -7.62452134 
5  b  B  A -4.68579210 0.47266047 
6  c  B  A 2.70550795 -0.50020883 
7  a  C  A 1.69312219 -4.26851536 
8  b  C  A 0.99236424 4.85013434 
snipped remaining 76 rows 

[[2]] 
    cond2 cond3   x 
1  A  A -6.31914953 
2  B  A -7.65206970 
3  C  A 1.36818527 
4  D  A 3.77492482 
5  E  A 2.68977303 
snipped 23 rows 

[[3]] 
    cond3   x 
1  A 8.104481 
2  B 17.766659 
3  C -14.577315 
4  D 4.398249 
+0

私はすでにこれを見る前にもう1つの答えを受け入れました。この答えは、私が目指していた次の抽象レベルです。 Rは私が現在知っているよりもはるかに多くの可能性を持ち、 'for()'ループの代わりに 'mapply()'を使うことは次のステップです! – DouglasM

+0

より良い回答が表示されると、チェックマークを変更することができます。私はそのようなことを求めていません。既に多くのポイントを得ました。あなたがSOを理解するのを手伝っているだけです。 –