[英]Apply variable function to columns in 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
使用“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.