【问题标题】:Apply variable function to columns in data.table将变量函数应用于 data.table 中的列
【发布时间】:2019-04-03 14:34:54
【问题描述】:

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

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

【问题讨论】:

  • 这可能会有所帮助...stackoverflow.com/questions/29620783/… 但是这样的东西不起作用:mtcars[,eval(returnNames) := lapply(.SD,function(u) {sapply(functionCall, function(f) do.call(f,list(u)))}),.SDcols = SDnames,by = cyl]

标签: r data.table


【解决方案1】:
  • 你不想要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"

【讨论】:

  • 这很优雅@RyanD ...谢谢!以前在 data.table 上没有看到 get
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 2015-07-08
  • 2017-05-12
  • 1970-01-01
  • 2014-06-28
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多