将变量函数应用于data.table中的列

时间:2018-10-30 14:10:32

标签: r data.table

我想知道是否有一种方法可以将字符串变量中的函数应用于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

使用“应用”和“评估”是正确的主意,还是我完全走错了路?

1 个答案:

答案 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