【问题标题】:How to group a data.table by a column supplied as string?如何按作为字符串提供的列对 data.table 进行分组?
【发布时间】:2017-08-10 15:05:41
【问题描述】:

我正在使用data.table 包来加快数据集上的一些汇总统计收集。

我很好奇是否有一种方法可以按多个列进行分组。我的数据如下所示:

Date             Cluster         Value  
2016-12-11          A              36
2016-12-11          B              40
2016-12-11          C              17
2016-12-12          A              41
2016-12-12          B              27
2016-12-12          C              19
...
2017-2-21           A              22
2017-2-21           B              35
2017-2-21           C              27

我想得到这样的数据:

Date             Cluster         Value       Total
2016-12-11          A              36          93
2016-12-11          B              40          93
2016-12-11          C              17          93
2016-12-12          A              41          87
2016-12-12          B              27          87
2016-12-12          C              19          87
...
2017-2-21           A              22          84
2017-2-21           B              35          84
2017-2-21           C              27          84

我的代码:

colName <- "Cluster"

dt[, list(colName, Value, Total=sum(Value)), by = c("Date")]

我只能得到这样的数据:

Date             colName         Value       Total
2016-12-11       Cluster           36          93
2016-12-11       Cluster           40          93
2016-12-11       Cluster           17          93
2016-12-12       Cluster           41          87
2016-12-12       Cluster           27          87
2016-12-12       Cluster           19          87
...
2017-2-21        Cluster           22          84
2017-2-21        Cluster           35          84
2017-2-21        Cluster           27          84

colName 是来自输入的参数。这就是问题所在。

【问题讨论】:

  • 接受的答案更好,但如果你想传递字符串作为参考,你可以在 dt 范围内使用eval(substitute ("str"))

标签: r data.table


【解决方案1】:

假设您只想添加总计(按日期分组),您可以使用 data.table := 运算符添加总计列(将保留所有现有列):

library(data.table)
dt <- structure(list(Date = c("2016-12-11", "2016-12-11", "2016-12-11", 
  "2016-12-12", "2016-12-12", "2016-12-12", "2017-02-21", "2017-02-21", 
  "2017-02-21"), Cluster = c("A", "B", "C", "A", "B", "C", "A", 
  "B", "C"), Value = c(36L, 40L, 17L, 41L, 27L, 19L, 22L, 35L, 
  27L)), .Names = c("Date", "Cluster", "Value"), row.names = c(NA, 
 -9L), class = "data.frame")
setDT(dt)
dt[, ":="(Total=sum(Value, na.rm = TRUE)), by = Date]

这会生成一个 data.table dt,其中 TotalValuesum(根据 Date)并包括 Cluster 列:

         Date Cluster Value Total
1: 2016-12-11       A    36    93
2: 2016-12-11       B    40    93
3: 2016-12-11       C    17    93
4: 2016-12-12       A    41    87
5: 2016-12-12       B    27    87
6: 2016-12-12       C    19    87
7: 2017-02-21       A    22    84
8: 2017-02-21       B    35    84
9: 2017-02-21       C    27    84

编辑: data.table 语法允许用更少的输入和

编写语句
dt[, Total := sum(Value, na.rm = TRUE), by = Date]

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多