Loops Stata帮助:通过添加现有变量来填充缺少的变量

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

现在我的数据看起来像这样。我要做的是用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    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的回答一样,但这一次也奏效了