【问题标题】:Sum multiple columns [duplicate]对多列求和[重复]
【发布时间】:2013-06-28 18:04:48
【问题描述】:

我正在尝试编写一个函数,该函数将根据前两列中的值对数据框中的列求和。例如,我有一个矩阵 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

我想先根据 column1(crs) 对列求和,然后再根据 column2(gr) 求和。结果会是,

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

但问题在于我必须定义无法修复的列的名称。所以,我想知道如何在不定义列名的情况下做到这一点。 提前致谢!

【问题讨论】:

  • Andrie 的回答没有问题,但您已经提出了data.table 的问题,并且有一种比使用plyr 更有效的方法(参见@eddi)。
  • @Arun 计算速度更快,是的,我同意。但效率也取决于您对框架的舒适程度。我发现我在编写plyr 解决方案方面效率更高,尽管我与data.table 有过广泛的合作。
  • @Andrie,我在这里强调 eddi 的答案的唯一原因是 OP 已经展示了他的 data.table 试图获得答案。但是,我是 plyr 的粉丝,对它或您的回答没有任何反对意见。只要不处理大量数据(我作为生物信息学家所做),就不需要牺牲 plyr 的简洁性(尽管我不得不说我个人觉得 data.table 语法非常简单) .
  • “plyr 的简洁性”??在大多数情况下,plyr 表达式通常要复杂得多且难以理解,在这种情况下,它只短了 1 个字符(而且只是因为我明确提到了“by”)。在遇到 data.table 之前,我开始使用 plyr,但很快就被非常陡峭的学习曲线和不清晰的语法关闭了(就在那时,我在寻找替代方案时找到了 data.table)。
  • @eddi,人们对不同的包装(产品)有不同的看法。许多人(包括您)在使用 data.table 的语法时遇到了问题(对包或 Matthew 没有冒犯)。我只是说这是主观的。最好尊重他人的差异,不要太挑剔。 plyr 受到很多很多(普通)R 用户的喜爱(data.table 只能替换 plyr 的一个或部分功能)并且受欢迎的原因有很多。

标签: r data.table


【解决方案1】:

你正在寻找这个:

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 2017-05-18
      • 2018-12-03
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2019-02-04
      相关资源
      最近更新 更多