【问题标题】:Summarizing with overlapping groups using dplyr使用 dplyr 对重叠组进行汇总
【发布时间】:2017-03-21 16:32:59
【问题描述】:

使用 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,我认为这并不算太糟糕,但我宁愿避免使用lapply。

【问题讨论】:

  • 您可以在base R 中执行此操作,即addmargins(rowsum(test$value, test$year), 1)
  • 我也想要一些适用于更复杂示例的东西,例如组可能是“2014:2015”,汇总统计数据可能是平均值或加权平均值等。
  • 我问了一个非常相似的问题 (stackoverflow.com/q/39106850/4269699),虽然它更笼统一些。 tl;dr - dplyr 没有明确的这个功能。在没有更好的情况下,我仍然使用bind_rows() 方法
  • 这是我发的关于gather方法的帖子https://colintb.github.io/overlapping_groups-example/

标签: r dplyr


【解决方案1】:

您可以创建“滚动组”并通过它们进行汇总。我使用了purrr 包中的map 函数(与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

您要求在dplyr 中创建重叠组的“最佳”方式。如果这是最好的方式,我会感到惊讶,但至少它似乎是一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2016-12-30
    • 2016-06-03
    相关资源
    最近更新 更多