【问题标题】:aggregate data table in rr中的聚合数据表
【发布时间】:2019-03-23 08:48:57
【问题描述】:

我有一个需要由一个变量 (ID) 聚合的大型数据表。变量 Vb 应该聚合为一个总和,但变量 Vc 应该保持它的值,因为它对于每个 ID 具有相同的值(类似于 SPSS 中的第一个值聚合)。

DT <- data.table(ID = c(11, 11, 22, 22, 22, 44, 55, 55, 55), 
    Vb=c(50,40,4,3,2,8,9,11,5), Vc = c(1,1,3,3,3,1,2,2,2))

我有大约 15 个变量要聚合(其中一半按总和,其他按值),因此最有效的方法将不胜感激!

【问题讨论】:

    标签: r data.table aggregate


    【解决方案1】:

    这应该有效(如果 Vc 是真正独特的):

    DT[, .(Vb=sum(Vb), Vc=unique(Vc)), by=ID]
    

    【讨论】:

    • 您可以只使用Vc[1] 而不是unique(VC),或者将Vc 传递给DT[, sum(Vb), .(ID, Vc)]
    • 这是在 data.table 上执行此操作的最佳方式。如果要按多个值聚合,请使用 by = .(ID1, ID2)。这里.等效于列表,输出是一个指定列的 data.table。我可能会建议将像 vb 这样的变量放在 by 中,这将涵盖它们在某些地方不是唯一的。
    【解决方案2】:

    使用sqldf

    我们可以group by IDsum(Vb)如下:

    library(sqldf)
    sqldf("select ID,sum(Vb),VC from DT group by ID") # If Vc is unique
    

    sqldf("select ID,sum(Vb),VC from DT group by ID,Vc") # If Vc is not unique
    

    输出:

      ID sum(Vb) Vc
    1 11      90  1
    2 22       9  3
    3 44       8  1
    4 55      25  2
    

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2016-01-13
      • 2014-04-23
      • 1970-01-01
      相关资源
      最近更新 更多