【发布时间】:2016-02-24 21:17:15
【问题描述】:
我有一个观察数据表和是非模型。为简单起见,我只假设组。我想计算一些分类统计数据,我想控制选择哪一个。我知道如何使用 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.
谢谢,
【问题讨论】:
-
写
my_newcols = quote(`:=`(n = a+b+c+d, s = a+c))和evaling 有用吗? -
保留您的
my_exprs也可能有效,但请按照 Arun 的回答定义my_newcols = as.call(c(quote(`:=`), my_exprs)):stackoverflow.com/a/22596160/1191259 ..? -
感谢@Frank 我尝试了你的第一个建议。它有效!
-
@Frank 请把它作为答案,这样问题就可以解决了
-
@jan 好主意,但现在我已经尝试过了,我意识到 OP 的示例不可重现,需要一些不存在的
categoryvar。
标签: r data.table