1

我不知道我是否没有使用正确的术语进行搜索,但我找不到有关此的帖子。

我有一个 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_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)) }

我得到了一个名为 results 的列表和输出。我想知道是否有更好的方法来代替使用 for 循环?

4

1 回答 1

2

我们可以创建“分组”列的索引(使用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
于 2016-02-15T16:25:05.687 回答