繁体   English   中英

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

[英]Apply variable function to columns in data.table

我想知道是否有办法将字符串变量中的函数应用于 data.table 中的 .SD cols。

我可以使用 data.table 概括函数调用的所有其他部分,包括输入和输出列,我很高兴。 但最后一块似乎是将一个变量函数应用于 data.table,我相信我之前已经用dplyrdo.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

使用“apply”和“eval”是正确的想法,还是我完全走错了路?

  • 你不想要lapply 由于myfunc采用具有多列的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

上面的代码是在下面的代码之后运行的

mtcars <- as.data.table(mtcars)

returnNames <- "calculatedColumn"

SDnames <- c("mpg","hp")

myfunc <- function(data) {
    print(data)
    return(data[,1]*data[,2])
}

functionCall <- "myfunc"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM