Statistics 与状态中的自我合并

Statistics 与状态中的自我合并,statistics,stata,Statistics,Stata,我有两组数据,A组和B组,如下所示: group key val A 0.00 1.23 A 0.25 2.31 A 0.50 3.10 A 0.75 4.21 A 1.00 2.51 A 0.00 1.43 B 0.25 1.31 B 0.50 5.10 B 0.75 2.21 B 1.00 8.51 我想要第四列,称之为Bval,如下所示: 对于B组中的所有观察值,

我有两组数据,A组和B组,如下所示:

group  key   val
A      0.00  1.23
A      0.25  2.31
A      0.50  3.10
A      0.75  4.21
A      1.00  2.51
A      0.00  1.43
B      0.25  1.31
B      0.50  5.10
B      0.75  2.21
B      1.00  8.51
我想要第四列,称之为Bval,如下所示:

对于B组中的所有观察值,该值应缺失 对于A组中的所有观察,该值应与共享同一密钥的B组中观察的val相对应。
我相信这不会太难,但我是一个完全的Stata新手,已经在谷歌上搜索了一个小时,似乎还没弄明白。像这样的东西怎么样

clear  
input str1 group key val  
A 0.00 1.23  
A 0.25 2.31  
A 0.50 3.10  
A 0.75 4.21  
A 1.00 2.51  
A 0.00 1.43  
B 0.25 1.31  
B 0.50 5.10  
B 0.75 2.21  
B 1.00 8.51  
end  

preserve  

keep if group == "B"  
rename val Bval  
tempfile b  
save `b'  

restore  

merge m:1 key using `b', nogenerate keep(1 3)  
replace Bval = . if group == "B"  

像这样的怎么样

clear  
input str1 group key val  
A 0.00 1.23  
A 0.25 2.31  
A 0.50 3.10  
A 0.75 4.21  
A 1.00 2.51  
A 0.00 1.43  
B 0.25 1.31  
B 0.50 5.10  
B 0.75 2.21  
B 1.00 8.51  
end  

preserve  

keep if group == "B"  
rename val Bval  
tempfile b  
save `b'  

restore  

merge m:1 key using `b', nogenerate keep(1 3)  
replace Bval = . if group == "B"  

这也适用于你的例子

 . clear 

 . input str1 group  key   val

             group        key        val
 1. A      0.00  1.23
 2. A      0.25  2.31
 3. A      0.50  3.10
 4. A      0.75  4.21
 5. A      1.00  2.51
 6. A      0.00  1.43
 7. B      0.25  1.31
 8. B      0.50  5.10
 9. B      0.75  2.21
10. B      1.00  8.51
11. end 

. sort key group

. gen Bval = val[_n+1] if group == "A" & group[_n+1] == "B" & key == key[_n+1] 
(6 missing values generated)

. l

      +---------------------------+
      | group   key    val   Bval |
      |---------------------------|
   1. |     A     0   1.23      . |
   2. |     A     0   1.43      . |
   3. |     A   .25   2.31   1.31 |
   4. |     B   .25   1.31      . |
   5. |     A    .5    3.1    5.1 |
      |---------------------------|
   6. |     B    .5    5.1      . |
   7. |     A   .75   4.21   2.21 |
   8. |     B   .75   2.21      . |
   9. |     A     1   2.51   8.51 |
  10. |     B     1   8.51      . |
      +---------------------------+

这也适用于你的例子

 . clear 

 . input str1 group  key   val

             group        key        val
 1. A      0.00  1.23
 2. A      0.25  2.31
 3. A      0.50  3.10
 4. A      0.75  4.21
 5. A      1.00  2.51
 6. A      0.00  1.43
 7. B      0.25  1.31
 8. B      0.50  5.10
 9. B      0.75  2.21
10. B      1.00  8.51
11. end 

. sort key group

. gen Bval = val[_n+1] if group == "A" & group[_n+1] == "B" & key == key[_n+1] 
(6 missing values generated)

. l

      +---------------------------+
      | group   key    val   Bval |
      |---------------------------|
   1. |     A     0   1.23      . |
   2. |     A     0   1.43      . |
   3. |     A   .25   2.31   1.31 |
   4. |     B   .25   1.31      . |
   5. |     A    .5    3.1    5.1 |
      |---------------------------|
   6. |     B    .5    5.1      . |
   7. |     A   .75   4.21   2.21 |
   8. |     B   .75   2.21      . |
   9. |     A     1   2.51   8.51 |
  10. |     B     1   8.51      . |
      +---------------------------+

工作起来很有魅力。非常感谢。工作起来很有魅力。非常感谢。美好的我的具体问题实际上比我发布的示例要复杂一些,对于更复杂的问题@mdb的解决方案实际上效果更好。但是你教了我一些关于Stata的知识,这些知识将来可能会派上用场,所以谢谢!你能简明扼要地描述一下并发症吗?另一种技术是egen Bval2=meanval/group==B,bykey。在同一领域内,请参阅此技巧和其他技巧的介绍。很好!我的具体问题实际上比我发布的示例要复杂一些,对于更复杂的问题@mdb的解决方案实际上效果更好。但是你教了我一些关于Stata的知识,这些知识将来可能会派上用场,所以谢谢!你能简明扼要地描述一下并发症吗?另一种技术是egen Bval2=meanval/group==B,bykey。请参阅,以了解在同一地区对这一技巧和其他技巧的描述。