我每年都有一个重复的横截面。我有一个变量var1
,它在给定年份的所有观察中都是相同的(例如,给定年份中变量的平均值)。我想创建一个变量var1_l
,它将是var1
的滞后版本。
例如,从数据集
id1 year var1
3 1990 3.5
4 1990 3.5
5 1991 4
6 1991 4
7 1991 4
我想获得
id1 year var1 var1_l
3 1990 3.5 .
4 1990 3.5 .
5 1991 4 3.5
6 1991 4 3.5
7 1991 4 3.5
解决方案是使用merge
,但是当数据集很大时,保存/恢复数据集需要花费大量时间。作为参考,下面是我目前的merge
解决方案:
preserve
keep year var1
replace year = year - 1
bys year: keep if _n == 1
rename var1 var1_l
sort year
tempfile temp
save `temp'
restore
merge m:1 year using `temp', nogen sorted
另一种选择是使用tabstat
返回的矩阵。我想知道是否有一个更优雅的解决方案(当年内没有观察时返回。 - 1)。
答案 0 :(得分:3)
这似乎有点不寻常,但可能只是对标准问题as explained here的一种扭曲。
. input id1 year var1
id1 year var1
1. 3 1990 3.5
2. 4 1990 3.5
3. 5 1991 4
4. 6 1991 4
5. 7 1991 4
6. end
. sort year id1
. gen var1_l = var1[_n-1] if year == year[_n-1] + 1
(4 missing values generated)
. replace var1_l = var1_l[_n-1] if year == year[_n-1] & missing(var1_l)
(2 real changes made)
. list
+----------------------------+
| id1 year var1 var1_l |
|----------------------------|
1. | 3 1990 3.5 . |
2. | 4 1990 3.5 . |
3. | 5 1991 4 3.5 |
4. | 6 1991 4 3.5 |
5. | 7 1991 4 3.5 |
+----------------------------+
答案 1 :(得分:2)
这个答案与@ Nick's交叉,但结果方面略有不同。我只检查year
是不同的,而他的代码检查year
是否连续。
clear
set more off
input ///
id year var1
1 1990 3.5
3 1990 3.5
2 1990 3.5
1 1991 2
2 1991 2
3 1991 2
3 1992 6
2 1992 6
1 1992 6
3 1993 6
2 1993 6
1 1993 6
4 1993 6
1 1994 4.3
2 1994 4.3
3 1994 4.3
end
list, sepby(year)
*----- what you want -----
sort year
gen var2 = var1[_n-1] if year != year[_n-1]
by year : replace var2 = var2[1]
list, sepby(year)