R 如何将聚合与列名称列表一起使用

R 如何将聚合与列名称列表一起使用,r,aggregate,R,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),

如何通过传递要汇总的条件和值列表,在函数中抽象
聚合

# 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)
#这很好用:

x您可以使用替代界面来聚合
,该界面不使用公式:

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

c1这正是我需要的!谢谢,它工作得很好!在看到这个答案之前,我已经接受了另一个答案。这个答案是我所面临的下一个抽象层次。R的潜力比我目前知道的要大得多,下一步就是使用
mappy()
而不是
for()
循环!当出现更好的答案时,可以更改复选标记。我不是要求这样。已经有很多分数了。只是想帮你理解。
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
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) )
[[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