我的问题最好用一个例子来描述:
数据:
v1 <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p")
v2 <- c("aa","bb","cc","dd","ee","ff","gg","hh","ii","jj","kk","ll","mm","nn","oo","pp")
v3 <- c("aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj","kkk","lll","mmm","nnn","ooo","ppp")
values <- 1:10000
y <- data.frame(var1=sample(v1,size = 100,replace=T),
var2=sample(v2,size=100,replace=T),
var3=sample(v3,size=100,replace=T),
val1=sample(values,size=100,replace=T),
val2=sample(values,size=100,replace=T))
head(y)
var1 var2 var3 val1 val2
1 h hh lll 4832 9547
2 h nn eee 727 6382
3 h bb jjj 9985 8041
4 e bb jjj 1438 280
5 k ff nnn 3094 4316
6 f cc kkk 7426 3588
基本上我需要通过var1,var2和var3的所有唯一组合来求和val1和val2。因此,上面head
语句中的所有行都不能汇总在一起。
在我正在使用的实际数据中,var1,var2和var3有数千个不同的值。此外,我想要分组的列数不同。这将用于闪亮的应用程序,其中用户选择他/她想要聚合的任意数量的组。我已经尝试过使用stats::aggregate
,但它似乎没有足够的通用性。
如果您需要其他任何帮助回答我的问题,请告诉我。
编辑: 到目前为止非常有帮助的回复并感谢你,但他们并不是我正在寻找的(我的错,我没有说清楚这个问题)。
问题是我的脚本自动化,因此它可以聚合上面的示例以及以下内容:
head(y)
var1 var2 var3 var4 var5 val1 val2 val3
1 p pp nnn ll aaa 3914 6621 8968
2 d ii jjj pp aaa 5885 955 7560
3 j bb ppp aa ccc 7979 5602 4639
4 e mm ooo mm fff 8746 8612 2212
5 g ee aaa kk lll 4795 6438 6318
6 f mm kkk ii ggg 7550 90 1173
在我的闪亮应用程序中,数据可能很容易看起来像这样,或任何其他任何数量的列变体。我知道变量和值列的索引值,但不知道它们的名称。所以我可以使用索引值,但它们正在改变。此外,我不能在任何列中进行硬编码,因为它们总是在变化。
我希望这有帮助!
答案 0 :(得分:3)
library(data.table)
y<-data.table(y)
setkey(y, var1, var2, var3)
y[,.(sum1 = sum(val1), sum2 = sum(val2)), by = c("var1", "var2", "var3") ]
var1 var2 var3 sum1 sum2
a cc ggg 4483 5176
a gg ccc 1928 1833
a mm ppp 1550 3930
a nn kkk 1340 2080
b dd ccc 8950 158
b hh bbb 4798 689
b kk mmm 129 9740
b pp ccc 8363 1531
c gg ggg 1662 125
c gg hhh 4485 3800
...
另一个受欢迎的选项是dplyr
:
library(dplyr)
y %>% group_by(var1, var2, var3) %>%
summarise(sum1 = sum(val1), sum2 =sum(val2))
var1 var2 var3 sum1 sum2
(fctr) (fctr) (fctr) (int) (int)
a cc ggg 4483 5176
a gg ccc 1928 1833
a mm ppp 1550 3930
a nn kkk 1340 2080
b dd ccc 8950 158
b hh bbb 4798 689
b kk mmm 129 9740
b pp ccc 8363 1531
c gg ggg 1662 125
c gg hhh 4485 3800
有人说dplyr
的语法更容易读/写,但我更喜欢这两种方法。速度通常是可比较的,但我相信data.table
具有非常大的数据集的优势。