R-检查新日期范围是否福尔斯现有日期范围内

30byixjq  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一个数据表定义如下:
| 实体|价值|斯达特|编辑日期|类型|
| - ------|- ------|- ------|- ------|- ------|
| A类|五个|2023年1月1日|2023年4月1日|事件1|
| A类|六个|2023年6月1日|2023年8月1日|事件2|
| B|八个|2023年1月1日|2023年3月1日|事件1|
| B|九|2023年5月1日|2023年6月1日|事件2|
如果用户输入一条新记录,其中实体A的日期范围为A, 55, 2/1/2023, 2/20/2023(Feb 1st到Feb 20th),则代码不应将此数据保存到数据库,因为实体A的第一个条目已经涵盖了从Jan 1st to April 1st开始的整个日期范围。
如何检查新的SDate和EDate是否在特定实体的 Dataframe 中现有SDate和EDate的范围内

62lalag4

62lalag41#

你可以使用semi_join()来决定哪些行不应该被添加,或者使用anti_join()来决定哪些行应该被添加,这需要dplyr1.1.0。
我添加了一个额外的“new”行,它不属于任何现有的"A"范围,以显示不同之处。

library(dplyr, warn.conflicts = FALSE)

df <- tibble(
  Entity = c("A", "A", "B", "B"),
  Value = c(5L, 6L, 8L, 9L),
  Sdate = as.Date(c("1/1/2023", "6/1/2023", "1/1/2023", "5/1/2023"), format = "%m/%d/%Y"),
  Edate = as.Date(c("4/1/2023", "8/1/2023", "3/1/2023", "6/1/2023"), format = "%m/%d/%Y"),
  Type = c("event1", "event2", "event1", "event2")
)
df
#> # A tibble: 4 × 5
#>   Entity Value Sdate      Edate      Type  
#>   <chr>  <int> <date>     <date>     <chr> 
#> 1 A          5 2023-01-01 2023-04-01 event1
#> 2 A          6 2023-06-01 2023-08-01 event2
#> 3 B          8 2023-01-01 2023-03-01 event1
#> 4 B          9 2023-05-01 2023-06-01 event2

new <- tibble(
  Entity = c("A", "A"),
  Value = c(55L, 56L),
  Sdate = as.Date(c("2/1/2023", "4/5/2023"), format = "%m/%d/%Y"),
  Edate = as.Date(c("2/20/2023", "4/10/2023"), format = "%m/%d/%Y")
)
new
#> # A tibble: 2 × 4
#>   Entity Value Sdate      Edate     
#>   <chr>  <int> <date>     <date>    
#> 1 A         55 2023-02-01 2023-02-20
#> 2 A         56 2023-04-05 2023-04-10

# only the rows that SHOULD NOT be added
semi_join(new, df, by = join_by(Entity, within(Sdate, Edate, Sdate, Edate)))
#> # A tibble: 1 × 4
#>   Entity Value Sdate      Edate     
#>   <chr>  <int> <date>     <date>    
#> 1 A         55 2023-02-01 2023-02-20

# the rows that SHOULD be added
anti_join(new, df, by = join_by(Entity, within(Sdate, Edate, Sdate, Edate)))
#> # A tibble: 1 × 4
#>   Entity Value Sdate      Edate     
#>   <chr>  <int> <date>     <date>    
#> 1 A         56 2023-04-05 2023-04-10

相关问题