如何添加缺失的月份值并删除 R 中 dplyr 中的重复项?

How can i add missing month value and remove duplicate in dplyr in R?

我有一个看起来像这样的数据集:

vaR date
A 1/1/2022
A 1/2/2022
A 1/3/2022
B 1/1/2022
B 1/3/2022
C 1/1/2022
C 1/1/2022
C 1/2/2022
C 1/2/2022
C 1/3/2022

我想按月份和 var 变量排列。但是,如果没有记录(丢失)一个月,我想在名为 Month 的新列中添加(出现)并改变(dplyr 短语)另一列,该列将检查该月是否有条目(逻辑条件) .但是有一些条目例如 C 有多个条目,这些条目计为一个(不同)。

理想情况下必须是这样的:

var Quarter Month Condition
A 1 1 TRUE
A 1 2 TRUE
A 1 3 TRUE
B 1 1 TRUE
B 1 2 FALSE
B 1 3 TRUE
C 1 1 TRUE
C 1 2 TRUE
C 1 3 TRUE

作为开始,我在 R 中尝试了这个:

var = c(rep("A",3),rep("B",2),rep("C",5));var
date = c(as.Date("2022/01/01"),as.Date("2022/02/01"),as.Date("2022/03/01"),
         as.Date("2022/01/01"),as.Date("2022/03/01"),
         as.Date("2022/01/01"),as.Date("2022/01/01"),as.Date("2022/02/01"),as.Date("2022/02/01"),as.Date("2022/03/01"))
data = tibble(var,date)
quarter = 1
data%>%
  dplyr::mutate(month = lubridate::month(date),
                Quarter = quarter)

但我不知道如何添加缺失的月份并检查验证条件。 有帮助吗?

您可以使用 complete() 填写缺失的月份,然后检查它们是否有关联的日期,然后使用 distinct() 找到唯一的组合。

library(dplyr)
library(tidyr)

var = c(rep("A",3),rep("B",2),rep("C",5))
date = c(as.Date("2022/01/01"),as.Date("2022/02/01"),as.Date("2022/03/01"),
         as.Date("2022/01/01"),as.Date("2022/03/01"),
         as.Date("2022/01/01"),as.Date("2022/01/01"),as.Date("2022/02/01"),as.Date("2022/02/01"),as.Date("2022/03/01"))
data = tibble(var,date)
quarter = 1
data %>% 
  mutate(month = lubridate::month(date)) %>% 
  complete(var, month) %>% 
  mutate(Quarter = quarter,
         Condition = !is.na(date)) %>% 
  distinct(var, month, Quarter, Condition)
#> # A tibble: 9 × 4
#>   var   month Quarter Condition
#>   <chr> <dbl>   <dbl> <lgl>    
#> 1 A         1       1 TRUE     
#> 2 A         2       1 TRUE     
#> 3 A         3       1 TRUE     
#> 4 B         1       1 TRUE     
#> 5 B         2       1 FALSE    
#> 6 B         3       1 TRUE     
#> 7 C         1       1 TRUE     
#> 8 C         2       1 TRUE     
#> 9 C         3       1 TRUE

reprex package (v2.0.1)

创建于 2022-06-01

您可以这样处理:

library(lubridate)
library(dplyr)
libraty(tidyr)

df <- df %>% mutate(month=month(date),quarter=quarter(month))
left_join(
  expand(df, var,month,quarter),
  select(df,var, month) %>% mutate(condition=TRUE) %>%  distinct()
) %>% mutate(condition=!is.na(condition))

输出

  var   month quarter condition
  <chr> <dbl>   <int> <lgl>    
1 A         1       1 TRUE     
2 A         2       1 TRUE     
3 A         3       1 TRUE     
4 B         1       1 TRUE     
5 B         2       1 FALSE    
6 B         3       1 TRUE     
7 C         1       1 TRUE     
8 C         2       1 TRUE     
9 C         3       1 TRUE