R语言如何根据事件起止变量生成区间内事件是否发生的指示变量
需求实现方案
核心逻辑:先匹配每个事件ID对应的起止时间区间,再判断每个时间点t是否落在任意一个有效区间内,是则标记为1,否则为0。
方法1:tidyverse 实现
library(tidyverse) # 提取所有事件的起止区间 event_intervals <- dat %>% pivot_longer(cols = c(id1, id2), names_to = "event_type", values_to = "event_id") %>% drop_na(event_id) %>% pivot_wider(names_from = event_type, values_from = t) %>% rename(start = id1, end = id2) # 生成目标列 dat <- dat %>% mutate(desiredoutcome = map_int(t, ~as.integer(any(.x >= event_intervals$start & .x <= event_intervals$end))))
方法2:base R 实现
无需额外安装依赖包,原生代码实现:
# 提取所有不重复的事件ID event_ids <- na.omit(unique(c(dat$id1, dat$id2))) # 生成每个事件对应的起止区间 event_intervals <- t(sapply(event_ids, function(id) { c(start = dat$t[dat$id1 == id], end = dat$t[dat$id2 == id]) })) # 遍历每个时间点判断是否在有效区间内 dat$desiredoutcome <- sapply(dat$t, function(x) { as.integer(any(x >= event_intervals[, "start"] & x <= event_intervals[, "end"])) })
两种方法生成的desiredoutcome和示例给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Tordir
相关产品推荐
相关产品推荐

