基于另一表起止时间为R数据表新增事件状态列的实现问题
方案1:tidyverse实现(符合你想用mutate的使用习惯)
先加载依赖包,统一时区后构建时间区间,再逐行判断是否落在任意区间内:
# 加载依赖 library(dplyr) library(lubridate) library(purrr) # 统一小表时区和大表保持一致(此处为GMT,可根据实际时区修改) balldrop.times <- balldrop.times %>% mutate( BallStart = force_tz(BallStart, tzone = "GMT"), BallEnd = force_tz(BallEnd, tzone = "GMT"), time_interval = interval(BallStart, BallEnd) ) # 新增事件状态列 raw.data <- raw.data %>% mutate( `Event Status` = if_else( map_lgl(DateTime, ~any(.x %within% balldrop.times$time_interval)), "Event Active", "Event Not Active" ) )
方案2:data.table实现(大表性能更优)
你的raw.data本身是data.table格式,用非等值连接实现效率更高,适合数据量较大的场景:
library(data.table) library(lubridate) # 转换小表为data.table格式,统一时区 setDT(balldrop.times) balldrop.times[, `:=`( BallStart = force_tz(BallStart, tzone = "GMT"), BallEnd = force_tz(BallEnd, tzone = "GMT") )] # 先默认标记为未激活,再匹配区间标记为激活 raw.data[, `Event Status` := "Event Not Active"] raw.data[balldrop.times, on = .(DateTime >= BallStart, DateTime <= BallEnd), `Event Status` := "Event Active"]
注意事项
- 时区统一是区间判断正确的前提,如果你实际使用的时区不是GMT,需要把代码中的
tzone参数改为对应的时区值。 - 你提供的示例输出区间刚好和小表第一个时间区间匹配,代码运行后可以直接得到你想要的标记效果。
内容的提问来源于stack exchange,提问作者new2data
相关产品推荐
相关产品推荐

