2016-02-15 3 views
0

Я не знаю, не ищу ли я правильные условия, но я не могу найти сообщение об этом.Группировка и суммирование кадра данных несколькими разными столбцами в R

У меня есть ДФ:

df <- data.frame(grouping_letter = c('A', 'A', 'B', 'B', 'C', 'C'), grouping_animal = c('Cat', 'Dog', 'Cat', 'Dog', 'Cat', 'Dog'), value = c(1,2,3,4,5,6)) 

Я хочу к группе grouping_letter и grouping_animal. Я хочу сделать это, используя dplyr.

Если бы я сделал это отдельно, это было бы:

df %>% group_by(grouping_letter) %>% summarise(sum(value)) 

df %>% group_by(grouping_animal) %>% summarise(sum(value)) 

Теперь допустим, у меня есть сотни столбцов мне нужно сгруппировать по отдельности. Как я могу это сделать?

Я пытался:

results <- NULL for (i in grouping_columns) { results[[i]] <- df %>% group_by(df$i) %>% summarize(sum(value)) }

Я получил список, названный результаты с выходом. Мне интересно, есть ли лучший способ сделать это вместо использования for-loop?

ответ

1

Мы можем создать индекс colums «группировки» (с использованием grep), цикл по индексу (с lapply) и отдельно получить sum о «ценности» после того, как группировка по колонку в «индексе».

library(dplyr) 
i1 <- grep('grouping', names(df)) 
lapply(i1, function(i) 
     df[setdiff(seq_along(df), i)] %>% 
        group_by_(.dots=names(.)[1]) %>% 
        summarise(Sumvalue= sum(value))) 
#[[1]] 
#Source: local data frame [2 x 2] 

# grouping_animal Sumvalue 
#   (fctr) (dbl) 
#1    Cat  9 
#2    Dog  12 

#[[2]] 
#Source: local data frame [3 x 2] 

# grouping_letter Sumvalue 
#   (fctr) (dbl) 
#1    A  3 
#2    B  7 
#3    C  11 

Или мы можем сделать это путем преобразования набора данных из «широких» до «длинного» формата, то группы заинтересованных столбцов и получить sum о «ценности».

library(tidyr) 
gather(df, Var, Group, -value) %>% 
     group_by(Var, Group) %>% 
     summarise(Sumvalue = sum(value)) 
#    Var Group Sumvalue 
#   (chr) (chr) (dbl) 
#1 grouping_animal Cat  9 
#2 grouping_animal Dog  12 
#3 grouping_letter  A  3 
#4 grouping_letter  B  7 
#5 grouping_letter  C  11 
+0

Я пробовал это на df из 11M строк, 12 значений cols и 6 группирующих vars. Выполнение очень долгого цикла завершено намного быстрее! – vagabond

+0

@vagabond Тогда преобразование из 'wide' в 'long' может занять немного времени по сравнению с методом цикла. Вы пробовали опцию 'lapply'? – akrun

+0

Да, это тот, который занимает очень долго! – vagabond

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

  • Нет связанных вопросов^_^