R语言:基于Panel Data创建Event Time变量的技术问询
为面板数据创建首次事件时间指示器
原始数据
d <- data.frame(id = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c"), time = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5), iz = c(0,1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1))
数据预览:
id time iz 1 a 1 0 2 a 2 1 3 a 3 1 4 a 4 0 5 a 5 0 6 b 1 0 7 b 2 0 8 b 3 0 9 b 4 0 10 b 5 1 11 c 1 0 12 c 2 0 13 c 3 0 14 c 4 1 15 c 5 1
需求
创建nvar列作为首次事件(iz=1)的时间指示器:
- 首次事件发生的时间点标记为
0 - 事件发生前的时间点,按距离首次事件的间隔取负数
- 事件发生后的时间点,按距离首次事件的间隔取正数
解决方案
方法1:使用dplyr(代码可读性高)
先加载dplyr包,按id分组计算:
library(dplyr) d <- d %>% group_by(id) %>% # 提取每个分组的首次事件发生时间 mutate(first_event_time = min(time[iz == 1])) %>% # 计算当前时间与首次事件时间的差值 mutate(nvar = time - first_event_time) %>% select(-first_event_time) %>% ungroup()
方法2:使用Base R(无需额外包)
通过tapply获取每个id的首次事件时间,再匹配计算差值:
# 获取每个id的首次事件发生时间 first_event <- tapply(d$time[d$iz == 1], d$id[d$iz == 1], min) # 计算nvar d$nvar <- d$time - first_event[d$id]
输出结果
运行上述代码后,得到的结果与期望一致:
id time iz nvar 1 a 1 0 -1 2 a 2 1 0 3 a 3 1 1 4 a 4 0 2 5 a 5 0 3 6 b 1 0 -4 7 b 2 0 -3 8 b 3 0 -2 9 b 4 0 -1 10 b 5 1 0 11 c 1 0 -3 12 c 2 0 -2 13 c 3 0 -1 14 c 4 1 0 15 c 5 1 1
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

