You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一表起止时间为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:45:04