使用dplyr创建重叠组的最佳方法是什么?
例如,假设您有以下数据集
test <- data.frame(year = rep(as.character(2014:2016), 2), value = 1:6)
并且您希望每年使用一个小组进行总结,然后是整个期间。 有两种方法可以做到:
使用bind_rows和mutate(可能在更复杂的示例中过滤)
year.totals <- bind_rows(test %>% mutate(year = "2014:2016"),
test) %>%
group_by(year) %>%
summarize(value = sum(value))
使用收集
year.totals.2 <- test %>%
mutate(year.2 = "2014:2016") %>%
gather(drop, year, year, year.2) %>%
group_by(year) %>%
summarize(value = sum(value))
有更好的方法吗?
我也见过this question and answer,我认为这太糟糕了,但我宁愿避免这种情况。
答案 0 :(得分:0)
你可以创建&#34;滚动组&#34;并由那些人总结。我使用了map
包中的purrr
函数(与dplyr
一样,是tidyverse
个包之一)。
首先,让我们创建两个辅助函数。根据您的需要,您可以对这些进行概括,以便灵活选择分组列,选择汇总统计信息等。
library(tidyverse)
# Create rolling year groups
year.groups = function(start.years, n) {
ll = length(start.years)
start.years = sort(start.years[-c((ll-(n-2)):ll)])
map(as.numeric(as.character(start.years)), function(x) x:(x+(n-1)))
}
# Summarise by rolling group
roll.group = function(vec) {
vec %>% map_df(~ test %>%
filter(year %in% .x) %>%
group_by(year = paste(year[which.min(year)], year[which.max(year)], sep="-")) %>%
summarise(value=sum(value)))
}
现在由滚动小组总结:
# Summarise by rolling year group and individual years
bind_rows(year.groups(unique(test$year), 2) %>%
roll.group(),
year.groups(unique(test$year), 3) %>%
roll.group(),
test %>% group_by(year) %>%
summarise(value=sum(value)))
year value 1 2014-2015 12 2 2015-2016 16 3 2014-2016 21 4 2014 5 5 2015 7 6 2016 9
你要求最好的&#34;在dplyr
中创建重叠组的方法。如果这是最好的方法,我会感到惊讶,但至少它似乎是 方式。