使用dplyr汇总重叠组

时间:2017-03-21 16:33:00

标签: r dplyr

使用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,我认为这太糟糕了,但我宁愿避免这种情况。

1 个答案:

答案 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中创建重叠组的方法。如果这是最好的方法,我会感到惊讶,但至少它似乎是 方式。