我想知道是否有一种方法可以将字符串变量中的函数应用于data.table中的.SD cols。
我可以使用data.table概括函数调用的所有其他部分,包括输入和输出列,对此我感到非常高兴。但是最后一部分似乎是将变量函数应用于data.table,我相信这是我之前使用 dplyr 和 do.call 完成的。 >
mtcars <- as.data.table(mtcars)
returnNames <- "calculatedColumn"
SDnames <- c("mpg","hp")
myfunc <- function(data) {
print(data)
return(data[,1]*data[,2])
}
这显然可行:
mtcars[,eval(returnNames) := myfunc(.SD),.SDcols = SDnames,by = cyl]
但是,如果我想应用动态功能,则无法执行以下操作:
functionCall <- "myfunc"
mtcars[,eval(returnNames) := lapply(.SD,eval(functionCall)),.SDcols = SDnames,by = cyl]
我收到此错误:
Error in `[.data.table`(mtcars, , `:=`(eval(returnNames), lapply(.SD, : attempt to apply non-function
使用“应用”和“评估”是正确的主意,还是我完全走错了路?
答案 0 :(得分:2)
lapply
。由于myfunc
的{{1}}具有多列,因此您只想将这样的数据表作为一个对象馈入函数。data.table
而不是get
eval
的左侧,只需将字符向量放在括号中,就不需要:=
-
eval
上面的代码在下面的代码之后运行
mtcars[, (returnNames) := get(functionCall)(.SD)
, .SDcols = SDnames
, by = cyl]
head(mtcars)
# mpg cyl disp hp drat wt qsec vs am gear carb calculatedColumn
# 1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 2310.0
# 2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 2310.0
# 3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 2120.4
# 4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 2354.0
# 5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 3272.5
# 6: 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 1900.5