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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:01:44