【问题标题】:R data.table grouped sum for column referenced by name stored in a variableR data.table 对存储在变量中的名称引用的列的分组总和
【发布时间】:2019-01-29 22:14:26
【问题描述】:

问题如下:我有一个data.table,其中有A列和B列。需要汇总,其名称作为字符向量传递到变量var1中。

我已经尝试寻找答案一段时间了,请参阅例如thisthis SO 帖子。由于找不到合适的解决方案,我不得不自己问这个问题。

现在我想做的是(使用 data.frame)

tmp[, var1] <- rep(1, nrow(tmp))
tmp <- aggregate(formula(paste(var1, "~ A + B")), tmp, sum)

但我没有用 data.table 做到这一点,我最后也是最大的努力是

tmp <- tmp[, list(..var1 = .N), by = list(A, B)]

现在,我的代码出了什么问题,我该如何解决?

请注意,我不想使用 := 运算符,因为我希望结果与来自 aggregate() 的结果完全相同。

编辑 1:一个工作示例:

library(data.table)
tmp <- data.table(A=c("R","G","G","B","B","B"), B=c(1,1,1,2,1,2))
print(tmp)

var1 <- "C"

tmp[, var1] <- rep(1, nrow(tmp))
tmp2 <- aggregate(formula(paste(var1, "~ A + B")), tmp, sum)
print(tmp2)

tmp3 <- tmp[, list(..var1 = .N), by = list(A, B)]
print(tmp3)

【问题讨论】:

  • 你应该分享一个最小的reproducible example
  • 只运行setnames(tmp[, .N, by = list(A, B)], "N", var1)就够了吗?

标签: r data.table


【解决方案1】:

希望我没有误读您的 qn。以下是一些选项:

1) 使用base::setNames

DT[, setNames(.(.N), var1), by=.(A, B)]

2) 使用data.table::setnames

setnames(DT[, .N, by=.(A, B)], "N", var1)[]

3) 使用base::structure 后跟base::as.list

DT[, as.list(structure(.N, names=var1)), by=.(A, B)]

数据:

DT <- data.table(A=c(1,1,2,2), B=c(1,1,2,3))
var1 <- "myCol"

【讨论】:

  • 在 by= 之后执行 (2) 将是最有效的,因为它使用 GForce。
  • 是的,(1) 最接近我的需要,虽然太不优雅,无法满足我对 data.table 语法的期望。
猜你喜欢
  • 2018-11-15
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多