Группировка R по комбинации нескольких столбцов

Рассматривая ввод dsam как:

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

Я пытался сгруппировать a и c и объединить 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. Из-за большого количества столбцов, используемых для группировки, я бы предпочел не объединять их вместе. Спасибо.


person Aramis7d    schedule 18.11.2016    source источник


Ответы (1)


Нам нужно .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'

person akrun    schedule 18.11.2016
comment
Ах, я могу быть таким идиотом. Благодарю вас! И таким образом мне даже не нужно будет unlist. - person Aramis7d; 18.11.2016