【问题标题】:Group-by in data.table with choosing first element in multiple columns在 data.table 中分组,在多列中选择第一个元素
【发布时间】:2016-10-08 01:25:46
【问题描述】:

给定数据表:

DT <- data.table(C1=1:6,C2=10:15,C3=1:3,C4=c("A","B")) 

   C1 C2 C3 C4
1:  1 10  1  A
2:  2 11  2  B
3:  3 12  3  A
4:  4 13  1  B
5:  5 14  2  A
6:  6 15  3  B

如果我想按 C4 分组,计算 C3 上的平均值并显示 C1 中的第一个元素,我会这样做:

DT[, list(C1=C1[1], AVG_C3=mean(C3), Freq=.N), by=C4]
   C4 C1 AVG_C3 Freq
1:  A  1      2    3
2:  B  2      2    3

如果我想获取C2中的第一个元素,那么我在上面的行中添加C2[1]

DT[, list(C1=C1[1], C2=C2[1], AVG_C3=mean(C3), Freq=.N), by=C4]

鉴于我有数百列并且我希望看到上面解释的第一个元素,我将如何处理此任务?

也许有一些简单的方法,比如使用所需列的向量cols &lt;- c("C1","C2"),但我不知道如何在DT[] 中分配给cols。我在这里查看了分配给多个列 Assign multiple columns using := in data.table, by group ,但我不确定如何在这种情况下实现它。非常感谢您的反馈:)

【问题讨论】:

    标签: r data.table variable-assignment


    【解决方案1】:

    假设您想分别查看C1C2C3 的第一个元素,您可以在.SD 上使用head,并使用.SDcols 指定列名。

    cols <- c("C1", "C2", "C3")
    DT[, c(head(.SD, 1), list(AVG_C3=mean(C3), Freq=.N)), by=C4, .SDcols = cols]
    
       C4 C1 C2 C3 AVG_C3 Freq
    1:  A  1 10  1      2    3
    2:  B  2 11  2      2    3
    

    【讨论】:

    • 或者甚至只是DT[, c(.SD[1], .(AVG_C3=mean(C3), Freq=.N)), by=C4, .SDcols = cols],因为.SD 本身就是data.table,所以.SD[1] 占据了第一行。
    【解决方案2】:

    我们可以通过'C4'对指定列进行汇总统计,并加入on原始数据集得到对应的行。

    DT[DT[, .(Avg_C3= mean(C3), freq= .N, C1 = C1[1L]) , by = C4], on = c("C4", "C1")]
    #   C1 C2 C3 C4 Avg_C3 freq
    #1:  1 10  1  A      2    3
    #2:  2 11  2  B      2    3
    

    或者使用dplyr的选项

    library(dplyr)
    DT %>% 
      group_by(C4) %>%
      mutate(Avg_C3 = mean(C3), freq = n(), C1 = first(C1)) %>% 
      slice(1L)
    #      C1    C2    C3    C4 Avg_C3  freq
    #   <int> <int> <int> <chr>  <dbl> <int>
    #1     1    10     1     A      2     3
    #2     2    11     2     B      2     3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多