繁体   English   中英

如何使用 Tidyverse 在 R 中聚合混乱的季度数据,搜索第一个连续的四个季度集

[英]How do I aggregate messy quarterly data in R using Tidyverse, searching for first contiguous set of four quarters

我有一个数据操作和排除挑战,我只是不知道如何成功解决。 我的数据格式整齐,所有观察结果都是行。 这是我的数据集的代表:

quarter <- c("Q4", "Q3", "Q2","Q1", "Q3", "Q2", "Q1","Q4", "Q2", "Q1", "Q4", "Q3", "Q2", "Q1","Q4", "Q3", "Q1")
year <- c("2020", "2020","2020","2020","2019","2019","2019", "2020", "2020","2020","2019","2019","2019","2019", "2020", "2020","2020")
country <- c("Brazil","Brazil","Brazil","Brazil","Brazil","Brazil","Brazil","Brazil","Brazil","Brazil", "Brazil","Brazil","Brazil","Brazil","France","France","France")
indicator <- c("Testing","Testing", "Testing","Testing","Testing","Testing","Testing","TestingPos","TestingPos","TestingPos","TestingPos","TestingPos","TestingPos","TestingPos", "Testing","Testing","Testing")
value <- sample(c(1:10), 17, replace = T)

quarterlydf <- data.frame(quarter, year, country, indicator, value)

quarter year country  indicator value
1       Q4 2020  Brazil    Testing     9
2       Q3 2020  Brazil    Testing     3
3       Q2 2020  Brazil    Testing     2
4       Q1 2020  Brazil    Testing     7
5       Q3 2019  Brazil    Testing     1
6       Q2 2019  Brazil    Testing     5
7       Q1 2019  Brazil    Testing     6
8       Q4 2020  Brazil TestingPos     4
9       Q2 2020  Brazil TestingPos     4
10      Q1 2020  Brazil TestingPos     3
11      Q4 2019  Brazil TestingPos     7
12      Q3 2019  Brazil TestingPos     2
13      Q2 2019  Brazil TestingPos     8
14      Q1 2019  Brazil TestingPos     1
15      Q4 2020  France    Testing     1
16      Q3 2020  France    Testing     1
17      Q1 2020  France    Testing     8

对于每个国家和指标组合,我需要找到最近的连续 4 个季度。 对于最近的一组四个连续季度(例如,2019 年第三季度、2019 年第四季度、2020 年第一季度、2020 年第二季度),我需要在新的 dataframe(此处为年度)中创建一个新行,其中包含国家、开始和结束季度/年、指标、包含季度的值的总和和平均值。

所有其他连续的四分之一集都应该被丢弃,任何不存在连续集的地方都应该被丢弃。

前一帧的产品应如下所示:

start     end country  indicator sum mean
1 Q1_2020 Q4_2020  Brazil    Testing  21 5.25
2 Q3_2019 Q2_2020  Brazil TestingPos  16    4

我不会 go 到我尝试过的所有内容中,但它变得非常非常难看,涉及尝试将顺序 ID 重新分配给每个可能的季度/年度组合,然后使用 pivot_wider() 为每个 ID 创建多个列,将这些列连接到一个结果,然后使用一组怪诞的 str_detect() 搜索来搜索和分配值。 长话短说,我认为我正在尝试的整个方法非常糟糕而且非常不雅。

必须有一种优雅的方式来做到这一点。

任何建议都会非常非常感谢。 谢谢你。

EDIT1:Per Limey 在所需的 output 中有一个小错字(Q2_2019 应该是 Q2_2020)。 这已得到修复。

虽然语法有点长(我会尝试更短),但这会起作用。 这里唯一的假设是没有年份完全丢失,否则该字段也需要由complete 否则这些将起作用

quarterlydf %>% 
  arrange(desc(year, quarter)) %>%
  group_by(country, indicator, year) %>%
  complete(quarter = rev(c("Q1", "Q2", "Q3", "Q4"))) %>%
  group_by(country, indicator) %>%
  arrange(desc(year), desc(quarter), .by_group = T) %>%
  filter(with(rle(is.na(value)), rep(lengths, lengths)) >=4, !is.na(value)) %>%
  slice_head(n = 4) %>%
  summarise(start = paste0(last(year),"_", last(quarter)),
            end = paste0(first(year),"_", first(quarter)),
            sum = sum(value),
            mean = mean(value))

# A tibble: 2 x 6
# Groups:   country [1]
  country indicator  start   end       sum  mean
  <chr>   <chr>      <chr>   <chr>   <int> <dbl>
1 Brazil  Testing    2020_Q1 2020_Q4    18   4.5
2 Brazil  TestingPos 2019_Q3 2020_Q2    16   4 

也可以倒过来(按时间顺序)

quarterlydf %>% 
  arrange(year, quarter) %>%
  group_by(country, indicator, year) %>%
  complete(quarter = c("Q1", "Q2", "Q3", "Q4")) %>%
  group_by(country, indicator) %>%
  filter(with(rle(is.na(value)), rep(lengths, lengths)) >=4, !is.na(value)) %>%
  slice_tail(n = 4) %>%
  summarise(start = paste0(first(year),"_", first(quarter)),
            end = paste0(last(year),"_", last(quarter)),
            sum = sum(value),
            mean = mean(value))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM