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

事件研究项目中按个体分组、基于事件时间的结果均值计算及R语言实现方案问询

如何在R中实现事件研究的均值计算(排除事件年份早于目标年份的个体)

首先,我们明确你的需求:要计算特定目标年份下结果变量的均值,但需要排除那些事件发生年份早于该目标年份的个体,同时只保留该目标年份有观测记录的个体。下面我会用两种方法实现这个逻辑——一种是用dplyr(更简洁直观,适合数据处理),另一种是基础R代码(不需要额外包)。

先修正模拟数据的创建方式

你原来用cbind创建数据会导致列变成因子类型,我们改用data.frame直接创建,确保所有变量都是数值型:

df <- data.frame(
  ID = c(1,1,1,1,2,2,2,3,3),
  year = c(2018,2019,2020,2021,2019,2020,2021,2018,2020),
  outcome = c(1,1,0,0,1,0,0,0,1),
  event_year = c(2019,2019,2019,2019,2020,2020,2020,2017,2017)
)

方法一:使用dplyr包(推荐)

dplyr的管道语法非常适合这种分组筛选+聚合的操作:

# 加载dplyr包(如果没安装先运行install.packages("dplyr"))
library(dplyr)

# 设定目标年份(这里是你例子中的2019年)
target_year <- 2019

# 计算符合条件的均值
mean_result <- df %>%
  # 第一步:筛选出目标年份的所有观测
  filter(year == target_year) %>%
  # 第二步:按个体ID分组,只保留事件年份不早于目标年份的个体
  group_by(ID) %>%
  filter(event_year >= target_year) %>%
  # 取消分组,计算结果变量的均值
  ungroup() %>%
  summarise(average_outcome = mean(outcome))

# 查看结果
print(mean_result)

运行后你会得到:

# A tibble: 1 × 1
  average_outcome
            <dbl>
1             0.5

完全符合你预期的结果。

方法二:使用基础R代码

如果你不想加载额外的包,可以用基础R的索引和聚合函数实现:

# 设定目标年份
target_year <- 2019

# 1. 先筛选出目标年份的观测数据
target_data <- df[df$year == target_year, ]

# 2. 找出事件年份不早于目标年份的有效个体ID
valid_ids <- unique(target_data$ID[target_data$event_year >= target_year])

# 3. 提取这些有效个体的结果变量值
valid_outcomes <- target_data$outcome[target_data$ID %in% valid_ids]

# 4. 计算均值
mean_result <- mean(valid_outcomes)

# 查看结果
print(mean_result)

运行后同样会输出0.5。

逻辑解释

  • 首先我们锁定了目标年份(2019)的所有观测,得到个体1和个体2的记录(个体3在2019年没有数据,自然不会被纳入)。
  • 然后我们过滤掉事件年份早于目标年份的个体:个体3的事件年份是2017,早于2019,但它在目标年份没有记录,所以不影响;而个体1(事件2019)和个体2(事件2020)都符合条件,保留它们的结果值计算均值。

内容的提问来源于stack exchange,提问作者Ludwig Gershwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:42:33