我不知道我是不是用正确的条款搜索,但我找不到关于此的帖子。
我有一个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循环?
答案 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