Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use aggregate with a list of column names

Tags:

r

aggregate

How do you abstract aggregate in a function by passing a list of conditions and values to summarize?

# 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)

Need to create a list of column names: (3 options shown) then call the function:

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)

I have reviewed many alternatives, but have not yet discovered the key to this abstraction.

like image 464
DouglasM Avatar asked Aug 29 '13 22:08

DouglasM


1 Answers

You can use the alternative interface to aggregate, which does not use a formula:

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
like image 92
nograpes Avatar answered Sep 29 '22 16:09

nograpes