1

我有以下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.

4

2 回答 2

4

我希望能够实现它,以便它适用于已知且始终命名为相同 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 和排序,所以我添加了这些步骤。

于 2016-08-02T14:41:15.600 回答
0

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

   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")
于 2016-08-02T16:17:36.550 回答