如何在面板数据中剔除无处理前后观测值的样本?
保留包含处理时间前后观测的面板样本
首先给出原始面板数据:
test <- data.frame(id = c("A", "A", "A", "B", "B"), year = c("2014", "2015", "2016", "2014", "2015"), income = c("100", "150", "200", "300", "200"))
需求说明:以2015年为处理发生时间,仅保留同时拥有2015年之前和之后观测数据的样本(即剔除id=B这类缺少2015年后数据的样本)。
以下是两种常用实现方法:
方法1:Base R 原生实现
# 先将year转换为数值型,避免字符比较的潜在问题 test$year <- as.numeric(test$year) # 筛选出符合条件的id:同时存在2015年前和2015年后的观测 valid_ids <- with(test, tapply(year, id, function(y) any(y < 2015) & any(y > 2015))) valid_ids <- names(valid_ids[valid_ids]) # 提取目标样本 filtered_test <- test[test$id %in% valid_ids, ]
方法2:dplyr 管道式实现
如果习惯使用tidyverse工具链,这种方式更简洁直观:
library(dplyr) filtered_test <- test %>% mutate(year = as.numeric(year)) %>% group_by(id) %>% # 按id分组后,仅保留同时包含2015年前、后观测的组 filter(any(year < 2015) & any(year > 2015)) %>% ungroup()
最终结果
两种方法得到的filtered_test均会保留id=A的所有观测,剔除id=B的样本:
id year income 1 A 2014 100 2 A 2015 150 3 A 2016 200
内容的提问来源于stack exchange,提问作者Anup
相关产品推荐
相关产品推荐

