【问题标题】:data.table grouping with variable names具有变量名称的 data.table 分组
【发布时间】:2017-09-06 03:15:49
【问题描述】:

我正在尝试从现有的data.table 创建一个汇总的data.table,但是我想在一个允许我传入列前缀的函数中执行此操作,以便我可以根据需要为我的列添加前缀。

我已经看到here 的问题/回复,但我正在尝试在不使用:= 运算符的情况下解决问题。

代表:

library(data.table)
tbl1 <- data.table(urn = c("a", "a", "a", "b", "b", "b"),
           amount = c(1, 2, 1, 3, 3, 4))

#    urn amount
# 1:   a      1
# 2:   a      2
# 3:   a      1
# 4:   b      3
# 5:   b      3
# 6:   b      4

tbl2 <- tbl1[, .(mean_amt = mean(amount),
                 rows = .N),
             by = urn]

#    urn mean_amt rows
# 1:   a 1.333333    3
# 2:   b 3.333333    3

这是为正在创建的列名使用固定名称,但是如上所述,我希望能够包含前缀。

我尝试了以下方法:

prefix <- "mypfx_"
tbl2 <- tbl1[, .(paste0(prefix, mean_amt) = mean(amount),
                 paste0(prefix, rows) = .N),
             by = urn]

# Desired output
#    urn mypfx_mean_amt mypfx_rows
# 1:   a       1.333333          3
# 2:   b       3.333333          3

不幸的是,代码收到错误消息:Error: unexpected '=' in " tbl2 &lt;- tbl1[, .(paste0(prefix, mean_amt) ="

任何关于如何进行上述工作的想法将不胜感激。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以使用setNames 动态重命名列:

    prefix <- "mypfx_"
    tbl2 <- tbl1[, setNames(list(mean(amount), .N), paste0(prefix, c("mean_amt", "rows"))), 
                   by = urn]
    
    tbl2
    #   urn mypfx_mean_amt mypfx_rows
    #1:   a       1.333333          3
    #2:   b       3.333333          3
    

    【讨论】:

    • 仅供参考,tbl2 &lt;- tbl1[, setNames(list(mean(amount), .N), paste0(prefix, c("mean_amt", "rows"))), by = urn, verbose=TRUE] 中有注释,说这是低效的。不过,我不知道最好的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2020-08-04
    • 2021-01-03
    相关资源
    最近更新 更多