如何添加缺失的月份值并删除 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
我有一个看起来像这样的数据集:
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