【问题标题】:How to add columns to data.table using eval如何使用 eval 将列添加到 data.table
【发布时间】: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 的示例不可重现,需要一些不存在的 category var。

标签: r data.table


【解决方案1】:

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

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

Arun's answer

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

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

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 2014-01-26
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多