【发布时间】:2016-10-09 19:16:09
【问题描述】:
我正在尝试做一件简单的事情,将 data.table 的 40 列除以它们的平均值。我无法提供实际数据(并非所有列都是数字,而且我有 > 8M 行),但这里有一个示例:
library(data.table)
dt <- data.table(matrix(sample(1:100,4000,T),ncol=40))
colmeans <- colMeans(dt)
接下来我想我会这样做:
for (col in names(colmeans)) dt[,col:=dt[,col]/colmeans[col]]
但这会返回错误,因为dt[,col] 要求不引用列名。使用 as.name(col) 并不能解决问题。
现在,
res <- t(t(dt[,1:40,with=F]/colmeans))
包含加速结果,但我无法将其插入 data.table 中,因为
dt[,1:40] <- res
不起作用,dt[,1:40:=res, with=F] 也不起作用。
以下工作,但我觉得它很丑:
for (i in seq_along(colmeans)) dt[,i:=dt[,i,with=F]/colmeans[i],with=F]
当然,我还可以通过在 res 和我的 data.table 具有的其他非数字列上调用 data.table() 来重新创建一个新的 data.table,但它们不是更有效吗?
【问题讨论】:
标签: r data.table