【问题标题】:Dynamically add column names to data.table when aggregating聚合时动态将列名添加到 data.table
【发布时间】:2016-12-20 09:48:56
【问题描述】:

我知道我们可以在通过引用创建列时动态添加列名(使用:=),如所述,例如这里:Dynamic column names in data.table

但是,我希望在聚合时动态添加列名。你能帮忙吗?

test_dtb <- data.table(a = sample(1:100, 100), b = sample(1:100, 100), id = rep(1:10, 10))
m = "blah"
test_dtb[ , list((m) = mean(b)), by = id]

我得到的错误是

Error: unexpected '=' in "test_dtb[ , list((m) =

【问题讨论】:

  • 我正在以编程方式创建 m 变量,它的长度可以从 1 到 5 不等。我认为很难定义从哪个索引设置名称。
  • m = c("blah", "foo");test_dtb[,setNames(list(mean(b),median(b)), m),by = id] 呢?
  • test_dtb[,eval(m):=mean(b),by = id] ?
  • 也适用于多个值:m = c("blah", "foo"); test_dtb[,eval(m):=list(mean(b),median(b)),by = id,verbose=TRUE] 给出:a b id blah foo

标签: r data.table


【解决方案1】:

正如 lukeA 在 cmets 中提到的,setNames 可以使用:

m <- c("blah", "foo")
test_dtb[ , setNames(list(mean(b), median(b)), m), by = id] 

【讨论】:

    【解决方案2】:

    只要确保 data.table 知道“m”不是变量名。

    括号或“c”可以。

    test_dtb[, (m)  := mean(b),by = id]
    test_dtb[, c(m) := mean(b),by = id]
    

    【讨论】:

    • 正如我在问题中提到的,它是在我汇总的时候。 cmets 中的答案对此有所帮助。
    • 糟糕!我的错。在这种情况下,lukeA 提出的解决方案是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2014-04-28
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多