R 缺少月份或季度时删除年度值

R 缺少月份或季度时删除年度值,r,dplyr,data.table,tidyverse,R,Dplyr,Data.table,Tidyverse,我有不同ID的月度、季度和年度数据。如果某个月缺少该值,则根据该月属于哪个季度,我们需要标记该季度以及年度值 同样,当季度和年度报告时,以及如果缺少一个季度。然后需要标记年度值 如果我们没有缺少月度值,则不应标记季度和年度 在下表中,针对id 1进行了筛选 第2行是第1季度的值。我们之所以保留这一点,是因为该季度的月度价值并未缺失 第6行是第2季度的值。标记它是因为,第4个月缺少值,而第4个月属于第2季度 第10行(第3季度)的情况类似,因为缺少第7个月和第8个月。第14行(第4季度),因为缺

我有不同ID的月度、季度和年度数据。如果某个月缺少该值,则根据该月属于哪个季度,我们需要标记该季度以及年度值

同样,当季度和年度报告时,以及如果缺少一个季度。然后需要标记年度值

如果我们没有缺少月度值,则不应标记季度和年度

在下表中,针对id 1进行了筛选

  • 第2行是第1季度的值。我们之所以保留这一点,是因为该季度的月度价值并未缺失
  • 第6行是第2季度的值。标记它是因为,第4个月缺少值,而第4个月属于第2季度
  • 第10行(第3季度)的情况类似,因为缺少第7个月和第8个月。第14行(第4季度),因为缺少第12个月
  • 第1行是年份值。我们标记它,因为在那一年中,总的来说,我们有几个月缺少值
  • 这就是我目前所拥有的

    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="_")
      ))
    
    这是你想要的吗

    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))
    
    库(tidyverse)
    失踪月数%
    可存储%>%
    过滤器(!is.na(月),is.na(值))%>%
    选择(-value)
    缺少四分之一%
    可存储%>%
    筛选器(是.na(月),!是.na(季度),是.na(值))%>%
    选择(-value)
    df_输出%
    左联合(缺少月%>%变异(月=NA\u整数)%%>%不同(id、月、季、年、标志x=1L),按=c(“id”、“月”、“季”、“年”)%%>%
    左联合(缺少月%>%变异(月=NA\u整数,季度=NA\u整数)%%>%不同(id,月,季度,年,标志y=1L),by=c(“id”,“月”,“季度”,“年”)%%>%
    左联合(缺少季度%>%变异(季度=NA\U整数)%%>%不同(id,月,季度,年,标志z=1L),by=c(“id”,“月”,“季度”,“年”))%%>%
    变异(flag=pmax(flag.x,flag.y,flag.z,na.rm=TRUE))%>%
    选择(-flag.x,-flag.y,-flag.z)%>%
    替换(列表(标志=0L))
    
    这就是你想要的吗

    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))
    
    库(tidyverse)
    失踪月数%
    可存储%>%
    过滤器(!is.na(月),is.na(值))%>%
    选择(-value)
    缺少四分之一%
    可存储%>%
    筛选器(是.na(月),!是.na(季度),是.na(值))%>%
    选择(-value)
    df_输出%
    左联合(缺少月%>%变异(月=NA\u整数)%%>%不同(id、月、季、年、标志x=1L),按=c(“id”、“月”、“季”、“年”)%%>%
    左联合(缺少月%>%变异(月=NA\u整数,季度=NA\u整数)%%>%不同(id,月,季度,年,标志y=1L),by=c(“id”,“月”,“季度”,“年”)%%>%
    左联合(缺少季度%>%变异(季度=NA\U整数)%%>%不同(id,月,季度,年,标志z=1L),by=c(“id”,“月”,“季度”,“年”))%%>%
    变异(flag=pmax(flag.x,flag.y,flag.z,na.rm=TRUE))%>%
    选择(-flag.x,-flag.y,-flag.z)%>%
    替换(列表(标志=0L))
    
    您可以先检查每年的
    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
    
    库(dplyr)
    df%>%
    分组依据(id)%>%
    mutate(year_flag=+(any(is.na(value))和row_number()==1))%>%
    分组依据(季度,.add=TRUE)%>%
    mutate(quarter_flag=+(any(is.na(value))&行数()==1))%>%
    解组%>%
    变异(标志=pmax(年份标志、季度标志))
    #id值月份季度年份年份标志季度标志
    #                       
    #1 11232 NA 2017 1 0 1
    #2 1 75 NA 1 2017 0 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 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
    #…还有38行
    

    我保留了额外的列
    year\u flag
    quarter\u flag
    ,以便您了解发生了什么。如果不需要,您可以将其从最终输出中删除。

    您可以先为每年检查
    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
    
    库(dplyr)
    df%>%
    分组依据(id)%>%
    mutate(year_flag=+(any(is.na(value))和row_number()==1))%>%
    分组依据(季度,.add=TRUE)%>%
    mutate(quarter_flag=+(any(is.na(value))&行数()==1))%>%
    解组%>%
    变异(标志=pmax(年份标志、季度标志))
    #id值月份季度年份年份标志季度标志
    #                       
    #1 11232 NA 2017 1 0 1
    #2 1 75 NA 1 2017 0 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 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
    #…还有38行
    

    我保留了额外的列
    year\u flag
    quarter\u flag
    ,以便您了解发生了什么。如果不需要,您可以将其从最终输出中删除。

    因为每月数据不会丢失是的,93是季度值。(第二季度)。但是,由于报告了该季度的所有3个月,即4、5、6个月,因此没有缺失值(5、33、35)。所以我们保留了四分之一的值。对不起,我刚更改了ID。复制粘贴的值。如果这是误导性的,我可以创造另一个不同的价值观