【发布时间】:2020-10-28 23:44:18
【问题描述】:
我有不同 ID 的月度、季度和年度数据。如果任何月份的值缺失,则根据该月所在的季度,我们需要标记该季度以及年度值。
类似地,当报告季度和年度时,如果缺少季度。然后需要标记年度值。
如果我们没有缺失月度值,则不应标记季度和年度。
在下表中过滤了 id 1 ...
- 第 2 行是第 1 季度的值。我们保留这一点是因为该季度的月度价值并未丢失。
- 第 6 行是第 2 季度的值。它被标记是因为第 4 个月有缺失值,而第 4 个月属于第 2 季度。
- 第 10 行 (Q3) 的情况类似,因为缺少第 7 个月和第 8 个月。第 14 行(第 4 季度),因为缺少第 12 个月
- 第 1 行是年份值。我们标记它是因为在那一年我们有几个月的缺失值
Example table:
# A tibble: 17 x 6
id value month quarter year flag
<int> <int> <int> <int> <int> <int>
1 1 1232 NA NA 2017 1
2 1 75 NA 1 2017 0
3 1 26 1 1 2017 0
4 1 29 2 1 2017 0
5 1 20 3 1 2017 0
6 1 93 NA 2 2017 1
7 1 NA 4 2 2017 0
8 1 33 5 2 2017 0
9 1 35 6 2 2017 0
10 1 51 NA 3 2017 1
11 1 NA 7 3 2017 0
12 1 NA 8 3 2017 0
13 1 3 9 3 2017 0
14 1 55 NA 4 2017 1
15 1 15 10 4 2017 0
16 1 25 11 4 2017 0
17 1 NA 12 4 2017 0
dput(df)
structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L), value = c(1232L, 75L, 26L, 29L, 20L,
93L, NA, 33L, 35L, 51L, NA, NA, 3L, 55L, 15L, 25L, NA, 1232L,
75L, 26L, 29L, 20L, 93L, 5L, 33L, 35L, 51L, 6L, NA, 3L, 55L,
15L, 25L, NA, 1232L, 75L, 26L, 29L, NA, 5L, 33L, 35L, 6L, NA,
3L, 15L, 25L, NA), month = c(NA, NA, 1L, 2L, 3L, NA, 4L, 5L,
6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, 1L, 2L, 3L, NA,
4L, 5L, 6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), quarter = c(NA, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, NA,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L,
NA, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), year = c(2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 217L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L)), class = "data.frame", row.names = c(NA, -48L))
想要的输出
> dput(df_output)
structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L), value = c(1232L, 75L, 26L, 29L, 20L,
93L, NA, 33L, 35L, 51L, NA, NA, 3L, 55L, 15L, 25L, NA, 1232L,
75L, 26L, 29L, 20L, 93L, 5L, 33L, 35L, 51L, 6L, NA, 3L, 55L,
15L, 25L, NA, 1232L, 75L, 26L, 29L, NA, 5L, 33L, 35L, 6L, NA,
3L, 15L, 25L, NA), month = c(NA, NA, 1L, 2L, 3L, NA, 4L, 5L,
6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, 1L, 2L, 3L, NA,
4L, 5L, 6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), quarter = c(NA, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, NA,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L,
NA, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), year = c(2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L), flag = c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L,
0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA,
-48L))
这是我目前所拥有的
df_output %>%
dplyr::group_by(id,year) %>%
dplyr::mutate(quarter_d = dplyr::case_when(
is.na(month) & !is.na(quarter) ~ paste("Q",quarter,year,sep="_"),
)) %>%
dplyr::mutate(quarter_flag = dplyr::case_when(
is.na(value) ~ paste("Q",ceiling(as.numeric(month) / 3),year,sep="_")
))
【问题讨论】:
-
因为月度数据没有丢失
-
是的,93 是季度值。 (第二季度)。但是,由于报告了该季度的所有 3 个月,即 4、5、6 个月没有缺失值(5、33、35)。所以我们保留了那个季度的价值。
-
抱歉,我刚刚更改了 ID。复制粘贴的值。如果这是误导,我可以创建另一个具有不同值的。
-
还有一个年份值是
217可能是错字
标签: r dplyr data.table tidyverse