【发布时间】:2021-04-07 14:10:19
【问题描述】:
我有一个数据操作和排除挑战,我只是不知道如何成功解决。我的数据格式整齐,所有观察结果都是行。这是我的数据集的代表:
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 年第二季度),我需要在新数据框(此处为 annualdf)中创建一个新行,其中包含国家、开始和结束季度/年、指标、包含的季度值的总和和平均值。
所有其他连续的四分之一集都应该被丢弃,任何不连续的集合都应该被丢弃。
前一帧的产品应该是这样的:
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
我不会详细介绍我尝试过的所有内容,但它变得非常非常难看,涉及尝试将顺序 ID 重新分配给每个可能的季度/年度组合,然后使用 pivot_wider() 为每个 ID 创建多个列,连接将这些列合并到一个结果中,然后使用一组怪诞的 str_detect() 搜索来搜索和分配值。长话短说,我认为我正在尝试的整个方法非常糟糕而且非常不雅。
必须有一种优雅的方式来做到这一点。
任何建议都会非常非常感谢。谢谢。
EDIT1:Per Limey 在所需的输出中有一个小错字(Q2_2019 应该是 Q2_2020)。此问题已修复。
【问题讨论】:
-
在您的样本数据中,
TestingPos在巴西的最新连续结果集不是 2020 年第 2 季度到 2019 年第 3 季度,而不是 Q32019 到 Q22019(反正不是四个连续季度)?跨度> -
你说得对,那是我的错字。暂时解决这个问题。谢谢。