2017-03-19 18 views
0

我正在使用data.table软件包来加速数据集上的一些汇总统计信息收集。如何通过以字符串形式提供的列对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是一个ar来自输入的指引。那就是问题所在。

+0

接受的答案是更好,但作为参考,如果你想传递一个字符串,你可以使用'的eval(替代(“海峡“))'在dt范围内 –

+0

谢谢。我会试试看。 – lojunren

回答

3

假设你只是想添加一个总(按日期分组),则可以使用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 dtTotal是的Valuesum(每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] 
相关问题