我在data.tables和其他一些data.tables中有多个海量数据集,其中包含我希望使用像:=
之类的东西执行的基本表达式的列表。
示例数据:
library(data.table)
tt = data.table(date=c(2011, 2012, 2013, 2014), count=c(2774343,4655434,648113695, 357733805))
date count
1: 2011 2774343
2: 2012 4655434
3: 2013 648113695
4: 2014 357733805
样本转换表。某些列可能是新列,其他列可能正在修改预先存在的列。我需要他们充分利用''功能,意味着他们需要引用现有列,即使它们正在创建新列。
xform=data.table(var=c("date2", "count2"), val=c("date - 2000", "count / 1000"))
var val
1: date2 date - 2000
2: count2 count / 1000
我无法想象让这个工作所需的神奇公式。我使用[.data.table
在:=
内尝试了各种lapply,parse,eval等组合。
我最后的希望是:
> xform[,expr := lapply(val, FUN=function(x) parse(text=x))]
> tt[,(xform$var) := eval(xform$expr)]
Error in eval(expr, envir, enclos) : attempt to apply non-function
技巧是我的输入数据量很大,最多包含100列,虽然有些转换可能很简单,但其他转换可能很复杂。
在这种情况下,输出应该是:
date count date2 count2
1: 2011 2774343 11 2774.343
2: 2012 4655434 12 4655.434
3: 2013 648113695 13 648113.695
4: 2014 357733805 14 357733.805
提前感谢您的帮助!
答案 0 :(得分:1)
我认为你必须逐行(xform
):
for(i in 1:nrow(xform))
tt[, xform$var[i] := eval(parse(text = xform$val[i]))]
tt
# date count date2 count2
#1: 2011 2774343 11 2774.343
#2: 2012 4655434 12 4655.434
#3: 2013 648113695 13 648113.695
#4: 2014 357733805 14 357733.805
如果您将转换存储为函数而不是文本,则可以执行以下操作:
xform = data.table(var = c("date2", "count2"),
val = c(quote(date - 2000), quote(count / 1000)))
tt[, xform$var := lapply(xform$val, eval, .SD)]