2013-05-27 36 views
1

我有两个组,A和B的数据,看起来像这样:自合并在Stata

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新手,一直谷歌搜索了一个小时,似乎无法弄清楚。

回答

2

这样的事情呢?

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" 
+0

工程就像一个魅力。谢谢! – RoyalTS

2

这对你的例子也适用。

. 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  . | 
     +---------------------------+ 
+0

不错!我的具体问题实际上比我发布的示例稍微复杂一点,对于更复杂的问题@mdb的解决方案实际上效果更好。但是你已经教会了我一些关于Stata的内容,可能在未来派上用场,所以谢谢! – RoyalTS

+0

你能简洁地描述复杂性吗? –

+4

另一种技术是'egen Bval2 = mean(val /(group ==“B”)),by(key)'。请参阅http://www.stata-journal.com/article.html?article=dm0055在同一领域撰写此技巧和其他技巧。 –