如何使用eval将列添加到data.table

时间:2016-02-24 21:17:15

标签: r data.table

我有一个观察数据表和是和否的模型。为简单起见,我只假设群体。我想要计算一些我想控制选择哪一个的分类统计数据。我知道如何使用eval并将其保存在另一个data.table中,但我想添加到现有的data.table,因为每个组只有一行。有谁可以帮助我?

首先,我为每个组创建列联表。

 DT  <- data.table::data.table(obs = rep(c("yes","no"), 5), mod = c(rep("yes",5), rep("no", 5)), groupBy = c(1,1,1,1,1,2,1,1,2,1))
categorical <- DT[, .(a = sum(obs == category[1] & mod == category[1]),
                  b = sum(obs == category[2] & mod == category[1]),
                  c = sum(obs == category[1] & mod == category[2]),
                  d = sum(obs == category[2] & mod == category[2])), by = groupBy]

然后定义统计数据

my_exprs = quote(list(
 n    =  a+b+c+d,
 s    = (a+c)/(a+b+c+d),
 r    = (a+b)/(a+b+c+d))) 

如果我使用以下行,它将为我提供一个新的data.table:

statList <- c("n","s")
w = which(names(my_exprs) %in% statList)
categorical[, eval(my_exprs[c(1,w)]), by = groupBy]

如何使用:=在这个例子中将结果添加到我的旧DT,这里称为分类?!我做了以下并收到错误消息:

categorical[, `:=`(eval(my_exprs[c(1,w)])), by = groupBy]


Error in `[.data.table`(categorical, , `:=`(eval(my_exprs[c(1, w)])),  : 
 In `:=`(col1=val1, col2=val2, ...) form, all arguments must be named.

谢谢,

1 个答案:

答案 0 :(得分:0)

我无法重现您的示例,但可能会保留您的my_exprs,但定义

my_newcols = as.call(c(quote(`:=`), my_exprs))

Arun's answer一样。

或者,您可以在开头使用:=构建表达式:

my_newcols = quote(`:=`(n = a+b+c+d, s = a+c))