【问题标题】:aggregate in j column to string column name, data.table在 j 列中聚合为字符串列名,data.table
【发布时间】:2018-10-29 05:03:45
【问题描述】:

我正在尝试使用 j 列创建汇总 data.table,但分配给存储在变量中的名称。

例如,我可以这样做:

x = data.table(c(1,2,3,4,5,6),c(2,2,2,3,3,3))

x[,.("a" = mean(V1), "b" = max(V1)),by=V2]

根据需要返回

   V2 a b
1:  2 2 3
2:  3 5 6

现在我不想使用名称“a”,而是使用变量名称:

varname = "a"

x[,.(varname = mean(V1), "b" = max(V1)), by=V2]

我希望它返回相同的输出,但当然这里 a 列被标记为“varname”。我尝试过使用 eval、get 和其他方法,但没有找到正确的语法。这是内置的,还是我必须在 data.table 之外重新标记名称?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以在聚合后使用setnames

    out <- x[,.( mean(V1), "b" = max(V1)), by=V2]
    setnames(out, 'V1', varname)
    out
    #   V2 a b
    #1:  2 2 3
    #2:  3 5 6
    

    或使用setNames

    x[, setNames(.(mean(V1), max(V1)), c(varname, "b")), by = V2]
    

    使用tidyverselhs 评估是可能的

    library(tidyverse)
    x %>%
       group_by(V2) %>% 
       summarise(!! varname := mean(V1))
    # A tibble: 2 x 2
    #     V2     a
    #   <dbl> <dbl>
    #1     2     2
    #2     3     5
    

    【讨论】:

    • 是否存在 eval 或 get 语法在左侧不起作用的原因?
    • @AllenWang 很难让它工作,但在 tidyverse 你可以做到x %&gt;% group_by(V2) %&gt;% summarise(!! varname := mean(V1))
    【解决方案2】:

    或者,您可以将函数放入命名列表中,如下所示:

    x[, lapply(structure(list(mean, max), names=c(varname, "b")), 
            function(f) f(V1)), 
        by=V2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多