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

如何在R中按国家年份创建标识二分变量首次正向变化的变量

在R中生成标记二分变量首次正向变化的分组变量

你需要按国家分组,标记每个国家中Dummy变量首次从0变为1的年份为1,其余年份为0。可以用dplyr包轻松实现这个需求,以下是具体代码和解释:

代码实现

library(dplyr)

# 读取示例数据
df <- read.table(
  text =
    "Country, Year, Dummy, NewChangeVariable,
US, 1, 1, 0,
US, 2, 0, 0,
US, 3, 1, 1,
US, 4, 1, 0,
UK, 1, 0, 0,
UK, 2, 1, 1, 
UK, 3, 1, 0, 
UK, 4, 1, 0, ", sep = ",", header = TRUE)

# 生成目标变量
df <- df %>%
  arrange(Country, Year) %>%  # 确保数据按国家、年份升序排列
  group_by(Country) %>%       # 按国家分组处理
  mutate(
    # 判断当前年份是否发生从0到1的正向变化(第一年无前置值,结果为NA)
    is_positive_change = Dummy == 1 & lag(Dummy) == 0,
    # 将NA转为FALSE,因为第一年没有变化过程,不算正向变化
    is_positive_change = coalesce(is_positive_change, FALSE),
    # 标记首次正向变化的年份为1,其余为0
    NewChangeVariable_generated = as.integer(cumsum(is_positive_change) == 1 & is_positive_change)
  ) %>%
  ungroup()

# 查看结果
print(df)

代码解释

  • arrange(Country, Year):必须先按国家和年份排序,保证滞后值的计算是基于前一年的数据。
  • group_by(Country):每个国家单独计算变化,避免不同国家的数据互相干扰。
  • is_positive_change:核心判断逻辑——当前年份Dummy为1,且前一年Dummy为0,才算是正向变化。
  • coalesce(is_positive_change, FALSE):处理第一年没有前置数据的情况,直接判定为非变化。
  • cumsum(is_positive_change):累计每个国家的正向变化次数,只有第一次出现变化时,累计值为1,此时标记为1;后续即使再出现变化,累计值大于1,也会被标记为0,符合“首次变化”的要求。
  • as.integer(...):将逻辑判断结果转为0/1的数值型变量,和目标格式一致。

运行代码后,生成的NewChangeVariable_generated列会和你示例中的NewChangeVariable完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:25:16