基于R语言创建条件时间线:根据立法变化生成新变量
创建法律实施时间相关的新变量
嘿,我来帮你搞定这个新变量的创建!根据你的数据和描述,我猜你想要的是:法律实施当年取值为0,实施之后每过一年数值加1(实施前的年份我默认设为NA,你可以按需调整)。下面用两种常用统计软件的代码来实现,你挑顺手的用就行:
R语言实现
首先先把你的原始数据构造出来,然后一步步处理:
# 构造原始数据框 df <- data.frame( Person = 1:10, Place = c("A", "A", "A", "B", "B", "B", "B", "B", "B", "B"), Year = c(1990, 1991, 1992, 1990, 1991, 1992, 1993, 1993, 1993, 1992), Law = c(0, 1, 1, 0, 0, 1, 1, 1, 1, 1) ) # 第一步:提取每个地区的法律首次实施年份 implementation_year <- aggregate(Year ~ Place, data = df[df$Law == 1, ], FUN = min) colnames(implementation_year)[2] <- "Implementation_Year" # 第二步:把实施年份合并回原始数据 df <- merge(df, implementation_year, by = "Place", all.x = TRUE) # 第三步:创建目标新变量 # 实施当年为0,之后逐年+1,实施前设为NA(若要改为0或负数,直接去掉ifelse即可) df$Law_Elapsed <- ifelse(df$Year < df$Implementation_Year, NA, df$Year - df$Implementation_Year) # 查看最终结果 print(df)
运行后得到的结果如下(整理成表格更直观):
| Person | Place | Year | Law | Implementation_Year | Law_Elapsed |
|---|---|---|---|---|---|
| 1 | A | 1990 | 0 | 1991 | NA |
| 2 | A | 1991 | 1 | 1991 | 0 |
| 3 | A | 1992 | 1 | 1991 | 1 |
| 4 | B | 1990 | 0 | 1992 | NA |
| 5 | B | 1991 | 0 | 1992 | NA |
| 6 | B | 1992 | 1 | 1992 | 0 |
| 10 | B | 1992 | 1 | 1992 | 0 |
| 7 | B | 1993 | 1 | 1992 | 1 |
| 8 | B | 1993 | 1 | 1992 | 1 |
| 9 | B | 1993 | 1 | 1992 | 1 |
如果希望实施前的年份按距离实施年的负数计算(比如A地1990年为-1),只需要把第三步的代码改成:
df$Law_Elapsed <- df$Year - df$Implementation_Year
Stata语言实现
如果你用Stata处理数据,代码如下:
* 导入原始数据 clear input Person Place str1 Year Law 1 A 1990 0 2 A 1991 1 3 A 1992 1 4 B 1990 0 5 B 1991 0 6 B 1992 1 7 B 1993 1 8 B 1993 1 9 B 1993 1 10 B 1992 1 end destring Year, replace * 提取每个地区的法律首次实施年份 bysort Place: gen Implementation_Year = min(Year) if Law == 1 bysort Place: replace Implementation_Year = Implementation_Year[1] * 创建目标新变量 * 实施当年为0,之后逐年+1,实施前设为NA gen Law_Elapsed = Year - Implementation_Year if Year >= Implementation_Year * 若要包含实施前的负数,直接用下面这行替换上面的gen命令 * gen Law_Elapsed = Year - Implementation_Year * 查看结果 list
内容的提问来源于stack exchange,提问作者Wafa
相关产品推荐
相关产品推荐

