【问题标题】:remove yearly values when month or quarters are missing缺少月份或季度时删除年度值
【发布时间】: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


【解决方案1】:

您可以先检查每年的 NA 值,然后检查每个季度的值,如果其中任何一个值为 1,则分配 1。

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(year_flag = +(any(is.na(value)) & row_number() == 1)) %>%
  group_by(quarter, .add = TRUE) %>%
  mutate(quarter_flag = +(any(is.na(value)) & row_number() == 1)) %>%
  ungroup %>%
  mutate(flag = pmax(year_flag, quarter_flag))

#      id value month quarter  year year_flag quarter_flag  flag
#   <int> <int> <int>   <int> <int>     <int>        <int> <int>
# 1     1  1232    NA      NA  2017         1            0     1
# 2     1    75    NA       1  2017         0            0     0
# 3     1    26     1       1  2017         0            0     0
# 4     1    29     2       1  2017         0            0     0
# 5     1    20     3       1  2017         0            0     0
# 6     1    93    NA       2  2017         0            1     1
# 7     1    NA     4       2  2017         0            0     0
# 8     1    33     5       2  2017         0            0     0
# 9     1    35     6       2  2017         0            0     0
#10     1    51    NA       3  2017         0            1     1
# … with 38 more rows

我保留了额外的列year_flagquarter_flag,以便您了解发生了什么。如果不需要,您可以将它们从最终输出中删除。

【讨论】:

  • 这是在做什么+(any(is.na(value)) &amp; row_number() == 1))你为什么加了+?
  • 即把逻辑值转换为整数。所以TRUE改为1,FALSE改为0。
  • 在 id 包含一个月内的所有值(一个月内没有缺失值)的情况下,这将失败。然后我们需要保留季度和年度。但是,在当前形式中,它每年标记 1,即使我们在一个月内拥有所有值。
  • 您是否有一个这样的示例用于共享数据,其中标志被错误设置为 1。
  • 抱歉,没有跟进更新。我猜它目前有效,但稍后会更新新数据。我还有另一个 Q here。想知道您是否有任何意见
【解决方案2】:

这是你想要的吗?

library(tidyverse)
missing_months <- df %>% 
  as_tibble %>% 
  filter(!is.na(month), is.na(value)) %>% 
  select(-value)

missing_quarter <- df %>% 
  as_tibble %>% 
  filter(is.na(month), !is.na(quarter), is.na(value)) %>% 
  select(-value)

df_output <- df %>% 
  left_join(missing_months %>% mutate(month = NA_integer_) %>% distinct(id, month, quarter, year, flag.x = 1L), by = c("id", "month", "quarter", "year")) %>% 
  left_join(missing_months %>% mutate(month = NA_integer_, quarter = NA_integer_) %>% distinct(id, month, quarter, year, flag.y = 1L), by = c("id", "month", "quarter", "year")) %>% 
  left_join(missing_quarter %>% mutate(quarter = NA_integer_) %>% distinct(id, month, quarter, year, flag.z = 1L), by = c("id", "month", "quarter", "year")) %>% 
  mutate(flag = pmax(flag.x, flag.y, flag.z, na.rm = TRUE)) %>% 
  select(-flag.x, -flag.y, -flag.z) %>% 
  replace_na(list(flag = 0L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多