2016-11-18 2 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") 

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

ответ

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, это будет группа только по первой колонке т.е. «а»

+0

Ах, я могу быть таким идиотом. Спасибо! И, таким образом, мне даже не нужно будет «списывать». – Aramis7d

Смежные вопросы