分组&通过R中的多个不同列汇总数据帧

时间:2016-02-15 16:21:09

标签: r dplyr apply group-summaries

我不知道我是不是用正确的条款搜索,但我找不到关于此的帖子。

我有一个df:

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_lettergrouping_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)) }

我在输出中得到了一个名为results的列表。我想知道是否有更好的方法来做这个而不是使用for循环?

1 个答案:

答案 0 :(得分:2)

我们可以创建一个&#39;分组&#39; colums(使用grep)循环索引(使用lapply)并单独获取sum的&#39;值&#39;按照&#39;索引&#39;。

中的列分组后
 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

或者我们可以通过转换来自&#39;范围的数据集来实现这一目标。长期&#39;格式,然后按相关列进行分组,并获得sum的值&#39;。

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