我有一个观察数据表和是和否的模型。为简单起见,我只假设群体。我想要计算一些我想控制选择哪一个的分类统计数据。我知道如何使用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.
谢谢,
答案 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))