如何在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
相关产品推荐
相关产品推荐

