gpt4 book ai didi

r - 标记多个日期范围内的日期

转载 作者:行者123 更新时间:2023-12-02 18:22:29 24 4
gpt4 key购买 nike

我正在尝试标记属于不同表格中多个范围内的所有日期。

events 表以及其他变量包含事件的 start_dateend_date:

events <- tibble(
name = c("Event A", "Event B"),
start_date = as.Date(c("2021-10-17", "2021-02-19")),
end_date = as.Date(c("2021-10-19", "2021-02-10"))
)

date_info 表包含该日期所有日期的长格式的日期统计 信息。年份:

date_info <- tibble(
date = as.Date(c("2021-10-16", "2021-10-16", "2021-10-17", "2021-10-17")),
statistic = c("var1", "var2", "var1", "var2"),
value = c(10, 54, 23, 34)
)

我需要在 date_info 中创建一个新列来标记属于事件的任何日期范围内的日期。

我已经尝试了下面的方法,但它仅在 events 中有一个事件时才有效

library(tidyverse)

date_info %>%
mutate(in_range = if_else(date < events$start_date | date > events$end_date, FALSE, TRUE))

我考虑过在 events 中创建一个 date_range 向量,以便可以使用下面的代码来标记日期:

library(tidyverse)

date_info %>%
mutate(in_range = if_else(date %in% events$date_range, TRUE, FALSE))

但是我不确定这是最好的方法。此外,我不确定如何获取这样的日期范围,因为 seq() 适用于单个开始/结束日期对而不是向量。

最佳答案

这可以通过基于范围的连接或非等值连接来完成。不幸的是,仅 dplyr 无法做到这一点,但以下之一应该可以正常工作。

下面的代码将特定的 events$name 分配给每一行,而不仅仅是“在范围内”指示符。使用 in_range = !is.na(name) 或类似的方法来简化它并不难。

模糊连接

# library(fuzzyjoin)
date_info %>%
fuzzyjoin::fuzzy_left_join(events,
by = c(date = "start_date", date = "end_date"),
match_fun = list(`>=`, `<=`))
# # A tibble: 4 x 6
# date statistic value name start_date end_date
# <date> <chr> <dbl> <chr> <date> <date>
# 1 2021-10-16 var1 10 NA NA NA
# 2 2021-10-16 var2 54 NA NA NA
# 3 2021-10-17 var1 23 Event A 2021-10-17 2021-10-19
# 4 2021-10-17 var2 34 Event A 2021-10-17 2021-10-19

sqldf

# library(sqldf)
sqldf::sqldf("
select t1.*, t2.name
from date_info t1
left join events t2 on t1.date between t2.start_date and t2.end_date")
# date statistic value name
# 1 2021-10-16 var1 10 <NA>
# 2 2021-10-16 var2 54 <NA>
# 3 2021-10-17 var1 23 Event A
# 4 2021-10-17 var2 34 Event A

数据表

library(data.table)
date_info_DT <- as.data.table(date_info)
events_DT <- as.data.table(events)
date_info_DT[events_DT, name := i.name,
on = .(date >= start_date, date <= end_date)][]
# date statistic value name
# <Date> <char> <num> <char>
# 1: 2021-10-16 var1 10 <NA>
# 2: 2021-10-16 var2 54 <NA>
# 3: 2021-10-17 var1 23 Event A
# 4: 2021-10-17 var2 34 Event A

(还有 data.table::foverlaps,它需要对第二个 data.table 进行key编辑。)

另一个选项,更简单一点(不需要类更改):

date_info %>%
mutate(in_range = data.table::inrange(date, events$start_date, events$end_date))
# # A tibble: 4 x 4
# date statistic value in_range
# <date> <chr> <dbl> <lgl>
# 1 2021-10-16 var1 10 FALSE
# 2 2021-10-16 var2 54 FALSE
# 3 2021-10-17 var1 23 TRUE
# 4 2021-10-17 var2 34 TRUE

关于r - 标记多个日期范围内的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70691179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com