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

R语言中基于分组逐行跨多列比较生成不平衡面板市场进入变量

实现思路

  • 用data.table分组向量化处理,自动适配不平衡面板、跳过全NA无效行,适合8k级观测的大数据量场景
  • 先标记每个观测的有效性(区域变量不全为NA即为有效)
  • 按ID分组后,对有效观测按period升序排列,自动取相邻有效观测的前向配对(中间的全NA行、无观测的period自动跳过)
  • 按规则逐观测赋值market_entry:
    1. 区域全为NA的无效观测直接赋值为NA
    2. 企业首个有效观测:若自身存在取值为2的区域,赋值为NA(无法判定是否此前已进入市场);若所有区域均为1,赋值为"no"
    3. 非首个有效观测:对比上一个有效观测的区域取值,若存在任意区域从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 02:15:05