2016-11-18 82 views
1

Consdering輸入dsam作爲組合:- [R分組在多個列

structure(list(a = structure(c(3L, 2L, 1L, 3L, 1L, 3L, 1L, 1L, 1L, 1L), 
.Label = c("A", "B", "C"), class = "factor"), b = c(1, 
1, 1, 1, 1, 3, 2, 3, 3, 1), c = structure(c(2L, 1L, 1L, 2L, 1L, 
3L, 1L, 1L, 3L, 3L), .Label = c("D", "E", "F"), class = "factor")), 
.Names = c("a", "b", "c"), row.names = c(NA, -10L), class = "data.frame") 

我試圖組超過ac和骨料b各組保持每組一個記錄。但是看起來下面的代碼行爲不同。 ,原始數據用於分組超過300列,所以它不是明確指定的列名,因此使用用於分組的列名的列表的選項。

方法1:

dsam %>% 
    group_by(a,c) %>% 
    mutate(rnk = row_number(), b = sum(b)) %>% 
    filter(rnk == max(rnk)) %>% print() 

#Source: local data frame [5 x 4] 
#Groups: a, c [5] 
# 
#  a  b  c rnk 
# <fctr> <dbl> <fctr> <int> 
#1  B  1  D  1 
#2  C  2  E  2 
#3  C  3  F  1 
#4  A  7  D  4 
#5  A  4  F  2 

方法2:

dsam %>% 
    group_by_(unlist(c("a","c"))) %>% 
    mutate(rnk = row_number(), b = sum(b)) %>% 
    filter(rnk == max(rnk)) %>% print() 


#Source: local data frame [3 x 4] 
#Groups: a [3] 
# 
#  a  b  c rnk 
# <fctr> <dbl> <fctr> <int> 
#1  B  1  D  1 
#2  C  5  F  3 
#3  A 11  F  6 

我怎樣才能使方法2的行爲很像方法1?

p.s.由於用於分組的大量列,我寧願不將它們連接在一起。 謝謝。

回答

0

我們需要.dots

dsam %>% 
    group_by_(.dots = c("a", "c")) %>% 
    mutate(rnk = row_number(), b = sum(b)) %>% 
    filter(rnk == max(rnk)) 
#  a  b  c rnk 
# <fctr> <dbl> <fctr> <int> 
#1  B  1  D  1 
#2  C  2  E  2 
#3  C  3  F  1 
#4  A  7  D  4 
#5  A  4  F  2 

如果我們使用沒有.dots,它將組只由第一列,即「A」

+0

啊,我是這樣一個白癡。謝謝! 這樣,我甚至不需要「unlist」。 – Aramis7d