楼主: che_nax
4067 8

[其他] 如何interchange数据中一部分的obs和vars [推广有奖]

  • 2关注
  • 0粉丝

本科生

81%

还不是VIP/贵宾

-

威望
0
论坛币
214 个
通用积分
0.0600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
14968 点
帖子
32
精华
0
在线时间
191 小时
注册时间
2008-3-12
最后登录
2023-1-31

5论坛币
数据是从NBER下的一个有关patent所属公司和其他信息的dta,大体结构如下

pdpass        pdpco1        source        begyr1        gvkey1        endyr1        pdpco2        begyr2        gvkey2        endyr2
32040490        65907        m2006        1995        65907        2001        135484        2002        135484        2005

pdpass最多有gvkey5,大部分只有一两个,后面就都missing了

我想要得到的结果大概是这样

pdpass         year           gvkey
32040490     1995          65907
32040490     1996          65907
32040490     1997          65907
............................
32040490     2001          65907
32040490     2002          135484
32040490     2003          135484
32040490     2004          135484
32040490     2005          135484

求高人指点,应该如何写命令,附上原始数据(后缀应为dta,但上传失败,改为txt)。注:有些pdpass的begyr和endyr是不连续的,比如endyr1 是1998, begyr2可能是2003.

dynass.txt (910.98 KB)

最佳答案

sungmoo 查看完整内容

use dynass, clear reshape long pdpco begyr endyr gvkey, i(pdpass source) keep if gvkey
关键词:Interchange change inter Hang vars patent source 如何 信息
沙发
sungmoo 发表于 2012-3-7 16:54:55 |只看作者 |坛友微信交流群
use dynass, clear
reshape long pdpco begyr endyr gvkey, i(pdpass source)
keep if gvkey<.
expand endyr-begyr+1
bys pdpass gvkey: g year=begyr+_n-1
keep pdpass year gvkey

使用道具

藤椅
aolei 发表于 2012-3-7 17:22:48 |只看作者 |坛友微信交流群
没看太懂,gvkey5和gvkey是什么关系?

使用道具

板凳
che_nax 发表于 2012-3-7 17:24:41 |只看作者 |坛友微信交流群
aolei 发表于 2012-3-7 17:22
没看太懂,gvkey5和gvkey是什么关系?
同一个公司不同时期用的gvkey,分别称作gvkey1,2,3,...

使用道具

报纸
che_nax 发表于 2012-3-7 19:56:26 |只看作者 |坛友微信交流群
做出来了,只是方法比较笨,要手动重复五次:
use dynass.dta
keep pdpass-endyr1
gen ny=endyr1-begyr1+1
expand ny
sort pdpass
bysort pdpass: gen year=begyr1-1+_n
rename gvkey1 gvkey
keep pdpass gvkey year

然后再keep begyr2-endyr2,drop missing做一次……最后五个merge到一块儿……

如果哪位高手有简洁的方法,5个币感谢优化

使用道具

地板
aolei 发表于 2012-3-7 21:04:45 |只看作者 |坛友微信交流群
*试一试
use dynass.dta,clear
gen x=max(endyr1,endyr2,endyr3,endyr4,endyr5)
gen n=x-begyr1
expand n+1
bys pdpass:gen year=begyr1+_n-1
gen gvkey=gvkey1
forvalue i=2/5{
replace gvkey=gvkey`i' if begyr`i'<=year & year<=endyr`i'+1
}
keep pdpass year gvkey

使用道具

7
che_nax 发表于 2012-3-8 10:38:40 |只看作者 |坛友微信交流群
aolei 发表于 2012-3-7 21:04
*试一试
use dynass.dta,clear
gen x=max(endyr1,endyr2,endyr3,endyr4,endyr5)
非常感谢帮助

我还有两个问题:
1.用max减begyr1忽略了年份不连续的情况,比如endyr1是1998,begyr2是2003,那么99-02的数据就被凭空造出来了……
2.forvalue过程中的if判断,最后的+1是起什么效果呢?比如时间段是91-93,94-96,97-05.那比如97年,它符合 begyr2(1994)<=1997 & 1997<=endyr2+1(1997),同时也符合begyr3(1997)<=1997 & 1997<=endyr3+1(2006).但我到data editor去看,97确实被分配了gvkey3,结果是对的。这里面是什么原因呢?还望解惑,多谢

使用道具

8
che_nax 发表于 2012-3-8 10:41:03 |只看作者 |坛友微信交流群
sungmoo 发表于 2012-3-7 22:51
use dynass, clear
reshape long pdpco begyr endyr gvkey, i(pdpass source)
keep if gvkey
哇……这个代码果然简洁,我觉得大概不会有更好的了吧

使用道具

9
aolei 发表于 2012-3-8 11:10:40 |只看作者 |坛友微信交流群
che_nax 发表于 2012-3-8 10:38
非常感谢帮助

我还有两个问题:
1、没注意到年份不连续,最后总的结果应该可以根据缺失情况keep或者drop一下
2、forvalue是个循环语句,每次只对特定的i起作用
3、崇拜sungmoo

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-11 23:24