【问题标题】:Summarizing unknown number of column in R using dplyr使用 dplyr 总结 R 中未知的列数
【发布时间】:2016-12-07 22:47:16
【问题描述】:

我有以下 data.frame (df)

ID1 ID2 Col1 Col2 Col3 Grp
A   B   1    3    6    G1
C   D   3    5    7    G1
E   F   4    5    7    G2
G   h   5    6    8    G2

我想要实现的目标如下: - 按 Grp 分组,简单 - 然后汇总,以便我对每个组的列求和,并使用所有 ID1 和 ID2 的字符串创建列

应该是这样的:

df %>% 
   group_by(Grp) %>% 
      summarize(ID1s=toString(ID1), ID2s=toString(ID2), Col1=sum(Col1), Col2=sum(Col2), Col3=sum(Col3))

一切都很好,我知道列数(Col1,Col2,Col3),但是我希望能够实现它,以便它适用于已知且始终命名为相同 ID1、ID2 的数据框、Grp 和任意数量的未知名称的附加数字列。

有没有办法在 dplyr 中做到这一点。

【问题讨论】:

  • 你试过了吗? summarise_at(vars(starts_with("Col")), sum)
  • 您如何将它与要汇总到的其他列以及可能不同/未知的名称而不是 Col1、col2 等一起使用
  • 如果可能的名称未知,您会建议计算机如何找到它们?
  • 跟进 Pierre 的评论,您想要引用的列有什么不同? Grp 列是否总是最后一列?在这种情况下,您将寻找一种方法来引用除最后一列之外的所有列。想想您作为人类如何知道自己在寻找什么,然后我们就可以让计算机找到它。
  • 为了记录,默认不区分大小写

标签: r dplyr summarize


【解决方案1】:

使用数据表,您可以尝试以下操作:

   setDT(df)
   sd_cols=3:(ncol(df)-1)
   merge(df[ ,.(toString(ID1), toString(ID2)), by = Grp],  df[ , c(-1,-2), with = F][ , lapply(.SD, sum), by = Grp],by = "Grp")

【讨论】:

    【解决方案2】:

    我希望能够实现它,以便它适用于具有已知且始终命名为相同 ID1、ID2、Grp 以及任意数量的未知名称的附加数字列的数据框。

    您可以先覆盖 ID 列,然后再按它们分组:

    DF %>% 
      group_by(Grp) %>% mutate_each(funs(. %>% unique %>% sort %>% toString), ID1, ID2) %>% 
      group_by(ID1, ID2, add=TRUE) %>% summarise_each(funs(sum))
    
    # Source: local data frame [2 x 6]
    # Groups: Grp, ID1 [?]
    # 
    #     Grp   ID1   ID2  Col1  Col2  Col3
    #   (chr) (chr) (chr) (int) (int) (int)
    # 1    G1  A, C  B, D     4     8    13
    # 2    G2  E, G  F, h     9    11    15
    

    我认为您需要在折叠成字符串之前进行 uniqify 和排序,所以我添加了这些步骤。

    【讨论】:

    • 不确定为什么“Grp,ID1 [?]”作为组给出...无论如何,请随时在 mutate_at 或 summarise_alongside 中进行编辑,或者如果这已经过时了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2015-05-21
    • 2021-04-03
    • 2020-03-29
    • 2021-03-16
    相关资源
    最近更新 更多