R语言中基于分组逐行跨多列比较生成不平衡面板市场进入变量
实现思路
- 用
data.table分组向量化处理,自动适配不平衡面板、跳过全NA无效行,适合8k级观测的大数据量场景 - 先标记每个观测的有效性(区域变量不全为NA即为有效)
- 按
ID分组后,对有效观测按period升序排列,自动取相邻有效观测的前向配对(中间的全NA行、无观测的period自动跳过) - 按规则逐观测赋值
market_entry:- 区域全为NA的无效观测直接赋值为NA
- 企业首个有效观测:若自身存在取值为2的区域,赋值为NA(无法判定是否此前已进入市场);若所有区域均为1,赋值为"no"
- 非首个有效观测:对比上一个有效观测的区域取值,若存在任意区域从1跳转为2,赋值为"yes",否则赋值为"no"(退出市场的2→1跳转不影响判定)
实现代码
library(data.table) # 可选:确保period按数值升序排列,避免factor排序问题 dat[, period := as.numeric(as.character(period))] setorder(dat, ID, period) # 替换为你实际的区域列范围:示例用region1-region5,实际数据直接用列索引102:162即可 region_cols <- paste0("region", 1:5) # 1. 标记有效观测:区域列不全为NA dat[, is_valid := rowSums(!is.na(.SD)) > 0, .SDcols = region_cols] # 2. 按ID分组,为有效观测匹配上一个有效观测的区域值(自动跳过无效行) dat[is_valid == TRUE, prev_regions := shift(.SD, n = 1, type = "lag"), .SDcols = region_cols, by = ID] # 3. 按规则生成market_entry dat[, market_entry := fcase( # 无效观测直接为NA is_valid == FALSE, NA_character_, # 首个有效观测:自身有区域为2 → NA is.na(prev_regions) & any(.SD == 2, na.rm = TRUE), NA_character_, # 首个有效观测:所有区域均为1 → no is.na(prev_regions) & all(.SD == 1, na.rm = TRUE), "no", # 非首个有效观测:判断是否存在1→2的跳转 !is.na(prev_regions), Reduce(`|`, Map(\(curr, prev) curr == 2 & prev == 1, .SD, prev_regions)) |> fifelse("yes", "no") ), .SDcols = region_cols] # 4. 清理中间变量,转成因子格式与示例对齐 dat[, c("is_valid", "prev_regions") := NULL] dat[, market_entry := as.factor(market_entry)]
代码说明
- 实际使用时仅需将
region_cols替换为102:162即可直接适配你的原始数据,无需手动修改列名 - 区域变量为factor类型时可直接比较,若担心水平不一致的问题,可提前将区域列转为数值型:
dat[, region_cols := lapply(.SD, as.numeric), .SDcols = region_cols] - 自动处理跨缺失值的配对场景(如C003的period5和period10直接配对),完全符合你提出的判定规则
内容的提问来源于stack exchange,提问作者ilka
相关产品推荐
相关产品推荐

