Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 多列求和_R_Data.table - Fatal编程技术网

R 多列求和

R 多列求和,r,data.table,R,Data.table,我试图编写一个函数,根据前两列中的值对数据框中的列求和。例如,我有一个矩阵M Crs gr P_7 P_8 38 1 3 16 38 1 12 45 38 1 9 28 40 2 3 9 40 2 14 29 40 1 4 3 40 2 8 2 我想先根据column1crs和column2gr对列求和。结果是, Crs gr P_7 P_8 38 1 24 89 4

我试图编写一个函数,根据前两列中的值对数据框中的列求和。例如,我有一个矩阵M

Crs gr  P_7 P_8      
38  1   3   16
38  1   12  45
38  1   9   28
40  2   3   9
40  2   14  29
40  1   4   3
40  2   8   2
我想先根据column1crs和column2gr对列求和。结果是,

    Crs gr  P_7  P_8      
    38  1   24  89
    40  2   25  40
    40  1   4   3
目前我正在使用

M <- M[, list(sum(P_7),sum(P_8)), by=list(Crs,gr)]
但问题是,我必须定义列的名称,而这些名称是不固定的。因此,我想知道在不定义列名称的情况下如何实现这一点。 提前谢谢

对于这种情况,plyr软件包有一些魔力。使用ddply和numcolwise的组合,如下所示:

library(plyr)
ddply(dat, .(Crs, gr), numcolwise(sum))
结果:

  Crs gr P_7 P_8
1  38  1  24  89
2  40  1   4   3
3  40  2  25  40

你在找这个:

M[, lapply(.SD, sum), by = list(Crs, gr)]

Andrie的回答没有问题,但你问了一个data.table问题,有一种比使用plyr更有效的方法来实现这一点,see@eddi's。@Arun计算速度更快,是的,我同意。但效率也取决于你对框架的适应程度。我发现我在编写plyr解决方案方面效率更高,尽管我已经广泛地使用了data.table。@Andrie,我在这里强调eddi的答案的唯一原因是OP已经展示了他获取答案的data.table尝试。然而,我是plyr的粉丝,对它和你的答案没有任何异议。只要不使用我作为生物信息学家所做的大量数据,就不需要牺牲plyr的简洁性,尽管我不得不说我个人觉得data.table语法非常简单。plyr的简洁性??ime大多数情况下,plyr表达式通常要复杂得多,也很难理解,在这种情况下,它只缩短了1个字符,这是因为我明确地提到了。在遇到data.table之前,我就开始使用plyr,但由于学习曲线陡峭,语法不清晰,我很快就对它失去了兴趣,于是我找到了data.table作为替代品。@eddi,人们对不同的软件包和产品有不同的看法。包括您在内的许多人都遇到过数据语法方面的问题。请不要冒犯软件包或Matthew。我只是说这是主观的。最好尊重他人的差异,不要太挑剔。plyr受到许多普通R用户的喜爱。目前,该表只能取代1个或部分plyr功能,并且由于许多原因而受到欢迎。