R 缺少月份或季度时删除年度值
我有不同ID的月度、季度和年度数据。如果某个月缺少该值,则根据该月属于哪个季度,我们需要标记该季度以及年度值 同样,当季度和年度报告时,以及如果缺少一个季度。然后需要标记年度值 如果我们没有缺少月度值,则不应标记季度和年度 在下表中,针对id 1进行了筛选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季度),因为缺
- 第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。复制粘贴的值。如果这是误导性的,我可以创造另一个不同的价值观