在data.table中添加未知列

时间:2015-10-13 00:42:31

标签: r data.table

如何以编程方式在data.table中添加未知列?

FAQ州的第1节:第6节:

  

要创建表达式,请使用quote()函数。我们将这些称为quote() - 要保存的表达式   与用于创建字符向量的双引号混淆,例如c(“x”)。最简单的   quote() - ed表达式只是一个列名:

但我似乎没有正确地做到这一点:

function a() {
  this.name = 'test';
}

function b() {
  this.age = 33;
  return new a();
}

var p = new b();
console.log(p); // a { name = 'test'}

我想要的是:

library(data.table)

counts <- as.data.table(data.frame(
    u = 1:3, 
    v = 3:5,
    w = 0:2,
    x = 3:5,
    y = 6:8,
    z = 1:3
))

form_nms <- c("t", "u", "v", "w")
forms <- form_nms[form_nms %in% colnames(counts)]
forms_exp <- paste(forms, collapse=" + ")
forms_exp2 <- quote(forms_exp)

counts[, formal := eval(forms_exp2)]
counts[, formal := eval(forms_exp)]

## Both give...
##    u v w x y z    formal
## 1: 1 3 0 3 6 1 u + v + w
## 2: 2 4 1 4 7 2 u + v + w
## 3: 3 5 2 5 8 3 u + v + w

1 个答案:

答案 0 :(得分:5)

你需要一个引用的表达式,但是你不能总是通过调用quote()获得一个。 quote()内没有变量评估。你可以用

做你想做的事
forms_exp3 <- parse(text=forms_exp)[[1]]
counts[, formal := eval(forms_exp3)]

这里我们使用parse()从文本中创建语言元素。 parse()将返回一个表达式(有点像语言对象的列表),所以我们只想返回第一个语言对象。比较

str(forms_exp)
# chr "u + v + w"
str(forms_exp2)
# symbol forms_exp
str(forms_exp3)
# language u + v + w