gpt4 book ai didi

r - 优雅地更新多个 data.table 列

转载 作者:行者123 更新时间:2023-12-04 02:36:46 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Apply a function to every specified column in a data.table and update by reference

(7 个回答)


3年前关闭。




我正在尝试做一件简单的事情,将 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]

当然,我也可以通过调用 data.table() 重新创建一个新的 data.table在 res和我的 data.table 具有的其他非数字列,但它们不是更有效吗?

最佳答案

怎么样

dt[, (names(dt)) := lapply(.SD, function(x) x/mean(x))]

如果您需要指定某些列,您可以使用
dt[, 1:40 := lapply(.SD, function(x) x/mean(x)), .SDcols = 1:40]

或者
cols <- names(dt)[c(1,5,10)]
dt[, (cols) := lapply(.SD, function(x) x/mean(x)), .SDcols = cols]

关于r - 优雅地更新多个 data.table 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37720816/

24 4 0