如何使用变量表达式添加/更改多个data.table列

时间:2014-06-10 19:41:23

标签: r data.table

我在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

提前感谢您的帮助!

1 个答案:

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