r data.table lapply 或 for 循环创建变量或生成列

标签 r dplyr data.table tidyverse lapply

我想使用 R data.table 的公式创建多个变量。我有一个变量列表,对于每个变量,我想执行计算并创建一个新变量,将相同的字符串粘贴到每个列名称上。我可以让它一次适用于一个变量,但它不适用于 lapply 或循环。我怀疑我丢失了 R data.table 和引号或变量名与字符串的内容。我需要使用“..”还是用 eval() 换行? dplyr(或任何 tidyverse)解决方案也可以解决该问题。

这里是 mtcars 的示例代码:

library(data.table)
mtcars.dt <- setDT(mtcars)
myVars <- c("mpg", "hp", "qsec")

# Doesn't work:
for( myVar in myVars){
  mtcars.dt[, paste0(myVar, ".disp.ratio") := myVar / disp]
}

# Doesn't work:
lapply(myVars, function(myVar) mtcars.dt[, paste0(myVar, ".disp.ratio") := myVar / disp])

# Works:
mtcars.dt[, mpg.disp.ratio := mpg / disp]

# Doesn't work
for (myVar in myVars){
  mtcars.dt[, paste0(myVar, ".disp.lm.adj") := 
              myVar - 
              lm(data = .SD, formula = myVar ~ disp)$coefficients[2] * (disp - mean(disp))]
}

# Doesn't work
lapply(myVars, function(x) mtcars.dt[, paste0(x, ".disp.lm.adj") := 
                                       x - 
                                       lm(data = .SD, formula = x ~ disp)$coefficients[2] * (disp - mean(disp))])

# Works
mtcars.dt[, mpg.disp.lm.adj := 
            mpg - 
            lm(data = .SD, formula = mpg ~ disp)$coefficients[2] * (disp - mean(disp))]

对于比率计算,我得到以下错误:

Error in myVar/disp : non-numeric argument to binary operator 

对于 lm 调整,我收到以下错误:

Error in model.frame.default(formula = myVar ~ disp, data = .SD, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'disp')

最佳答案

我们可以使用get

library(data.table)
for( myVar in myVars){
   mtcars.dt[, paste0(myVar, ".disp.ratio") := get(myVar) / disp]
  }

或者转换为symbol后用eval换行

for( myVar in myVars){
   mtcars.dt[, paste0(myVar, ".disp.ratio") := eval(as.name(myVar)) / disp]
  }

或者另一种选择是在.SDcols中指定,循环遍历.SD(Data.table的子集,进行转换并通过赋值创建新变量( :=)

mtcars.dt[, paste0(myVars, ".disp.ratio") := lapply(.SD, `/`, disp), 
             .SDcols = myVars]

对于第二种情况,我们可以使用paste创建公式

for (myVar in myVars) {
  mtcars.dt[, paste0(myVar, ".disp.lm.adj") := 
              get(myVar) - 
              lm(data = .SD, formula = paste(myVar,  "~ disp"))$coefficients[2] *
               (disp - mean(disp))]
}

关于r data.table lapply 或 for 循环创建变量或生成列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59978580/

相关文章:

r - 自动仅替换字符串中的特定字符

r - 是否有交互式输出设备可以在 R 中查看 3D 图形?

R 如何改变行的子集

根据开始和结束时间之间的间隔计算的 R 组变量(以天为单位)

从 data.table groupby 模型中恢复 lm() 结果

r - 子集指定月份和年份的数据框

javascript - 如何在 R 的 Leaflet 中将 preferCanvas 标志设置为 True

r - 使用多个测试组执行 Wilcoxon 测试

r - 在 r 中的 dplyr::group_by 之后将组变量转换为组名称

r - fread 未从包 data.table 中读取 csv 文件的最后一行,错误消息为 'Discarded single-line footer'