2013-08-29 47 views
5

Làm thế nào để bạn tóm tắt aggregate trong một hàm bằng cách chuyển danh sách các điều kiện và giá trị để tóm tắt?Cách sử dụng tổng hợp với danh sách tên cột

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

Cần để tạo ra một danh sách các tên cột: (3 lựa chọn hiển thị) sau đó gọi hàm:

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) 

Tôi đã xem xét nhiều lựa chọn thay thế, nhưng chưa phát hiện ra chìa khóa dẫn đến sự trừu tượng này.

Trả lời

8

Bạn có thể sử dụng giao diện thay thế cho aggregate, mà không sử dụng một công thức:

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

đó là chính xác những gì tôi cần! Cảm ơn bạn, nó hoạt động hoàn hảo! – 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)) 

Kết quả là một danh sách ba dataframes

[[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

Tôi đã chấp nhận câu trả lời khác trước khi nhìn thấy câu trả lời này. Câu trả lời này là cấp độ trừu tượng tiếp theo mà tôi đã đứng đầu. R có nhiều tiềm năng hơn tôi hiện đang biết, và việc sử dụng 'mapply()' thay vì một vòng lặp 'for()' là bước tiếp theo về phía trước! – DouglasM

+0

Dấu kiểm có thể được thay đổi khi câu trả lời tốt hơn xuất hiện. Tôi không yêu cầu như vậy. Đã có rất nhiều điểm rồi. Chỉ cần cố gắng giúp bạn hiểu SO. –

Các vấn đề liên quan