Loops Stata帮助:通过添加现有变量来填充缺少的变量
现在我的数据看起来像这样。我要做的是用logrd[_n+1]-avgrdgr[_n+1]填充logrd中缺少的值Loops Stata帮助:通过添加现有变量来填充缺少的变量,loops,stata,Loops,Stata,现在我的数据看起来像这样。我要做的是用logrd[_n+1]-avgrdgr[_n+1]填充logrd中缺少的值 age avgrdgr logrd -37 0.1 . ... -3 -0.2 . -2 -0.1 . -1 0.3 . 0 0.4 . 1 0.1 . 2 0.6 . 3 0.5
age avgrdgr logrd
-37 0.1 .
...
-3 -0.2 .
-2 -0.1 .
-1 0.3 .
0 0.4 .
1 0.1 .
2 0.6 .
3 0.5 1
所以结果应该是这样的
age avgrdgr logrd
-37 0.1 0.3
...
-3 -0.2 -0.8
-2 -0.1 -0.9
-1 0.3 -0.6
0 0.4 -0.2
1 0.1 -0.1
2 0.6 0.5
3 0.5 1
我尝试通过创建这样的代码来循环它
foreach x of logrd & y of avgrdgr{
if missing(`x'){
bys cus: replace `x' = `x'[_n+1] - `y'[_n+1]
}
}
这是我第一次独自尝试创建一个循环,我被卡住了。。请帮帮我 您不需要循环。但是,由于Stata从第一次观测到最后一次观测都在处理数据,因此需要临时反转数据,以便稍后的观测在您要填写的早期观测之前。这里有一些类似于您可以使用的代码
* Example generated by -dataex-. To install: ssc install dataex
clear
input byte age float avgrdgr float logrd
-3 -.2 .
-2 -.1 .
-1 .3 .
0 .4 .
1 .1 .
2 .6 .
3 .5 1
end
gsort -age
replace logrd = logrd[_n-1]-avgrdgr[_n-1] if missing(logrd)
sort age
导致
. list, clean
age avgrdgr logrd
1. -3 -.2 -.8
2. -2 -.1 -.9
3. -1 .3 -.6
4. 0 .4 -.2
5. 1 .1 -.1
6. 2 .6 .5
7. 3 .5 1
也许下面的数据看起来更像您的数据,其中包括在示例代码中使用但在示例数据中不存在的明显标识符
* Example generated by -dataex-. To install: ssc install dataex
clear
input byte(cus age) float(avgrdgr logrd)
1 -3 -.2 .
1 -2 -.1 .
1 -1 .3 .
1 0 .4 .
1 1 .1 .
1 2 .6 .
1 3 .5 1
2 -3 -.2 .
2 -2 -.1 .
2 -1 .3 .
2 0 .4 .
2 1 .1 .
2 2 .6 .
2 3 .5 0
end
generate negage = -age
bysort cus (negage): replace logrd = logrd[_n-1]-avgrdgr[_n-1] if missing(logrd)
drop negage
sort cus age
导致
. list, sepby(cus)
+-----------------------------+
| cus age avgrdgr logrd |
|-----------------------------|
1. | 1 -3 -.2 -.8 |
2. | 1 -2 -.1 -.9 |
3. | 1 -1 .3 -.6 |
4. | 1 0 .4 -.2 |
5. | 1 1 .1 -.1 |
6. | 1 2 .6 .5 |
7. | 1 3 .5 1 |
|-----------------------------|
8. | 2 -3 -.2 -1.8 |
9. | 2 -2 -.1 -1.9 |
10. | 2 -1 .3 -1.6 |
11. | 2 0 .4 -1.2 |
12. | 2 1 .1 -1.1 |
13. | 2 2 .6 -.5 |
14. | 2 3 .5 0 |
+-----------------------------+
这与法律
foreach
语法相去甚远。请注意,foreach
语法图中不允许的任何内容都是禁止的,这一点很简单,但很重要。
此外,请注意,if
语句并不像您所期望的那样工作。在循环中,每次评估都没有不同的结果if missing(无论什么)
作为一个命令,仅表示if missing(无论什么[1])
除非您的示例简化了关键细节,否则只有一个循环,所以这就足够了
clear
input age avgrdgr logrd
-3 -0.2 .
-2 -0.1 .
-1 0.3 .
0 0.4 .
1 0.1 .
2 0.6 .
3 0.5 1
end
quietly forval age = 2(-1)-3 {
replace logrd = logrd[_n+1] - avgrdgr[_n+1] if age == `age'
}
list, sep(0)
+-----------------------+
| age avgrdgr logrd |
|-----------------------|
1. | -3 -.2 -.8 |
2. | -2 -.1 -.9 |
3. | -1 .3 -.6 |
4. | 0 .4 -.2 |
5. | 1 .1 -.1 |
6. | 2 .6 .5 |
7. | 3 .5 1 |
+-----------------------+
我曾尝试过颠倒顺序,就像@William Lisowski的回答一样,但这一次也奏效了