在data.table中添加未知列

Tyl*_*ker 1 r data.table

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

FAQ的第1:6节说明:

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

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

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
Run Code Online (Sandbox Code Playgroud)

我想要的是:

##    u v w x y z formal
## 1: 1 3 0 3 6 1      4
## 2: 2 4 1 4 7 2      7
## 3: 3 5 2 5 8 3     10
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 5

你需要一个带引号的表达式,但你并不总是通过调用得到一个quote().内部没有可变的评价quote().你可以在这里做你想做的事

forms_exp3 <- parse(text=forms_exp)[[1]]
counts[, formal := eval(forms_exp3)]
Run Code Online (Sandbox Code Playgroud)

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

str(forms_exp)
# chr "u + v + w"
str(forms_exp2)
# symbol forms_exp
str(forms_exp3)
# language u + v + w
Run Code Online (Sandbox Code Playgroud)