【发布时间】:2020-06-22 15:25:40
【问题描述】:
我有一个大型数据集,其中包含一些感兴趣的核心变量,我需要计算许多不同的操作。我在数据表dt 中有这些变量的向量cols,我正在尝试使用lapply 创建新变量。在创建需要使用数据表中多个现有变量的新变量时,我遇到了麻烦,这些变量的名称是围绕核心变量构建的。这是一个例子(代码在这里运行):
dt = data.table( id = c(1,1,2,2,3,3), x = 1:6, y = 7:12, z = 13:18) ## example data
cols = c("x","y","z") ## my list of variables
dt[ , paste0(cols, ".avg") := lapply(.SD, function(x) mean(x, na.rm = T)), by = .(id), .SDcols = cols]
我想继续以这种方式创建新变量,但我很难引用通过前面的lapply 步骤创建的新列。我想计算列x 和x.avg 之间的差异,但我一直遇到错误。我尝试了以下变体,所有这些都会导致错误:
dt[ , paste0(cols,".diff") := lapply(.SD, function(x) x-eval(paste0(x,".avg"))), .SDcols = cols]
Error in x-eval(paste0(x,".avg")) :
non-numeric argument to binary operator
我想要一个等同于以下内容的lapply 步骤:
dt[ ':=' (x.diff = x-x.avg,
y.diff = y-y.avg,
z.diff = z-z.avg)]
提前致谢!
【问题讨论】:
标签: r data.table lapply