具有可变列名的数据表的操作

时间:2015-03-06 00:39:37

标签: r data.table

我正在尝试对作为变量传递的data.table列执行操作。

这是一个玩具示例:

library(data.table)
set.seed(2)
DT <- data.table(replicate(3, runif(4)))
> DT
          V1        V2        V3
1: 0.1848823 0.9438393 0.4680185
2: 0.7023740 0.9434750 0.5499837
3: 0.5733263 0.1291590 0.5526741
4: 0.1680519 0.8334488 0.2388948

假设感兴趣的列作为变量的值传递:

> print(target.column <- sample(colnames(DT), 1))
[1] "V3"

所以我想对列V3执行一些操作,比如说,为了简单起见,将值设置为0.5。我已经使用可怕的pasteparseeval成功完成了这项工作:

> eval(parse(text = paste0("DT[", target.column, " < 0.5, ", target.column, " := 0.5, ]")))
          V1        V2        V3
1: 0.1848823 0.9438393 0.5000000
2: 0.7023740 0.9434750 0.5499837
3: 0.5733263 0.1291590 0.5526741
4: 0.1680519 0.8334488 0.5000000

但是我的其他尝试都没有成功:

> DT[eval(target.column) < 0.5, eval(target.column) := 0.5, ]
          V1        V2        V3
1: 0.1848823 0.9438393 0.4680185
2: 0.7023740 0.9434750 0.5499837
3: 0.5733263 0.1291590 0.5526741
4: 0.1680519 0.8334488 0.2388948
> DT[as.name(target.column) < 0.5, as.name(target.column) := 0.5, ]
          V1        V2        V3
1: 0.1848823 0.9438393 0.4680185
2: 0.7023740 0.9434750 0.5499837
3: 0.5733263 0.1291590 0.5526741
4: 0.1680519 0.8334488 0.2388948
> DT[deparse(substitute(target.column)) < 0.5, deparse(substitute(target.column)) := 0.5, ]
          V1        V2        V3
1: 0.1848823 0.9438393 0.4680185
2: 0.7023740 0.9434750 0.5499837
3: 0.5733263 0.1291590 0.5526741
4: 0.1680519 0.8334488 0.2388948

我已经在SO和ol&#39;上找到了解决方案。 interweb一直无法找到任何有用的东西......是否有&#34; data.table&#34;这样做的方法?

2 个答案:

答案 0 :(得分:4)

您可以使用

DT[ get(target.column) < .5, (target.column) := .5]

给出了期望的结果。

答案 1 :(得分:1)

您的代码修改将使用eval(as.symbol(eval(as.name(

 DT[ eval(as.symbol(target.column)) < .5, (target.column):= .5][]
 #         V1        V2        V3
 #1: 0.1848823 0.9438393 0.5000000
 #2: 0.7023740 0.9434750 0.5499837
 #3: 0.5733263 0.1291590 0.5526741
 #4: 0.1680519 0.8334488 0.5000000