2016-08-02 65 views
1

我有以下data.frame(DF)总结数目不详列在R中使用dplyr

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,容易 - 再总结使每个组我总结的列和创建列与所有ID1s字符串和ID2s

这将是这样的:

一切都很好我知道列的数量(Col1,Col2,Col3),但是我希望能够实现它,以便它可以为已知的数据框工作,并且始终将其命名为相同的ID1,ID2,Grp ,以及任何数量的未知名称的附加数字列。

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

+0

您是否尝试过? 'summarise_at(vars(starts_with(“Col”)),sum)' –

+0

您将如何与其他列进行汇总,并且可能使用不同/未知名称而不是Col1,col2等。 – kwicher

+1

如果可能的名称是不知道,你会如何建议一台电脑找到他们? –

回答

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和排序之前崩溃为字符串,所以我加入那些脚步。

+0

不知道为什么将“Grp,ID1 [?]”作为组给出......无论如何,如果这已过时,请随时在mutate_at或summarise_alongside中进行编辑。 – Frank

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")