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

基于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)

运行后得到的结果如下(整理成表格更直观):

PersonPlaceYearLawImplementation_YearLaw_Elapsed
1A199001991NA
2A1991119910
3A1992119911
4B199001992NA
5B199101992NA
6B1992119920
10B1992119920
7B1993119921
8B1993119921
9B1993119921

如果希望实施前的年份按距离实施年的负数计算(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:13:29