楼主: tatarose
6908 9

[数据管理求助] 数据合并 [推广有奖]

  • 0关注
  • 0粉丝

小学生

21%

还不是VIP/贵宾

-

威望
0
论坛币
6 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
42 点
帖子
5
精华
0
在线时间
5 小时
注册时间
2012-12-27
最后登录
2013-1-29

楼主
tatarose 发表于 2012-12-27 15:39:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
手头有一些医院的数据panel data,7年的数据,每年的医院都有一些不一样的。想把这七年当中相同的医院找出来,并且把数据合并到一张表里,该怎么做呢。我是使用stata的新手,请帮忙回答详细些。感激万分。数据样式

table 1
suryea   provincename   hospitalname  expenditure  revenue
2001             A                       a                 XX                XX
2001             B                       a                 XXX              XXX
2001             B                       b                 XX                 XX

table2
suryea   provincename   hospitalname  expenditure  revenue
2002             A                       a                 XX                XX
2002             B                       a                 XXX              XXX
2002             B                       c                 XX                 XX


想合并成的样子
suryea   provincename   hospitalname  expenditure  revenue
2001             A                       a                 XX                XX
2001             B                       a                 XXX              XXX

2002             A                       a                 XX                XX
2002             B                       a                 XXX              XXX


每年的数据的变量数是一样的,但观察值有区别,关键变量是省份的名字和医院名字,只有这两个变量同时匹配时才能认定是同一家医院的数据, 该如何实现这个操作呢,多谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据合并 expenditure panel data province Revenue 医院

回帖推荐

monstersivle 发表于6楼  查看完整内容

不客气。 好,7年数据,每年的数据做以下处理 因为同一所医院在好几个省都有分院,等于说其实观测值的识别符是 省+医院 所以可以将2变量合并作为识别符,命名为id, egen id=concat(provincename hospitalname), punct(-) concat(varlist)是合并两个字串的命令,用连字符hyphen"-"连接 【之后可以用split , p("-")还原回省、医院】 然后存成tab`i'.dta, 1-7 (因为不知道哪些id是7年里一直有的,所以现在还做不了什么动作) ...

沙发
tatarose 发表于 2012-12-27 20:07:41
继续求啊,各位高手抽空帮帮忙。

藤椅
monstersivle 发表于 2012-12-27 20:36:39
【i'm rookie】没太理解意图,我想就是两个表append,然后keep if provincename=="A" & hospitalname=="a"这是你说的同时匹配么,用&连接两个条件? hospital.zip (13.56 KB)
import excel using hos.xls, firstrow sheet("Sheet1") clear
save svy1,replace
import excel using hos.xls, firstrow sheet("Sheet2") clear
save svy2,replace
use svy1,clear
append using svy2
keep if (provincename=="A" & hospitalname=="a") | ///
(provincename=="B" & hospitalname=="a")
save svy,replace



不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

板凳
tatarose 发表于 2012-12-27 21:43:36
可能是我没太表述清楚,我的数据库是不同省份每年的医院经营方面的数据,每年大概1000所医院,共有7年的数据,但每年的医院并不完全一样,因为有倒闭的还有合并的,我想在这些数据里找到在这七年里一直都存在的医院,7年内任意一年数据不完整的医院剔除掉。

或者说是一个有条件的append,只有关键变量省名,医院名完全匹配的数据才做append,如何实现呢?

报纸
tatarose 发表于 2012-12-27 21:54:41
monstersivle 发表于 2012-12-27 20:36
【i'm rookie】没太理解意图,我想就是两个表append,然后keep if provincename=="A" & hospitalname=="a"这 ...
十分感谢,但是不太容易实现,我想做的其实是一个有条件的append,只有关键变量provincename 和 hospitalname完全匹配然后才做数据的纵向合并,不匹配的数据删掉。
keep if (provincename=="A" & hospitalname=="a") | ///
(provincename=="B" & hospitalname=="a")
因为我也不知道哪些省份的哪些医院是7年内一直都存在的,所以好像用不了这个命令啊,另外有六十多个省市,将近一千家医院,手动输这个命令好像也不太现实哦。
不管怎么说,还是十分感谢!

地板
monstersivle 发表于 2012-12-28 00:15:02
tatarose 发表于 2012-12-27 21:54
十分感谢,但是不太容易实现,我想做的其实是一个有条件的append,只有关键变量provincename 和 hospital ...
不客气。
好,7年数据,每年的数据做以下处理
因为同一所医院在好几个省都有分院,等于说其实观测值的识别符是 省+医院
所以可以将2变量合并作为识别符,命名为id,
egen id=concat(provincename hospitalname), punct(-)
concat(varlist)是合并两个字串的命令,用连字符hyphen"-"连接 【之后可以用split , p("-")还原回省、医院】
然后存成tab`i'.dta, 1-7 (因为不知道哪些id是7年里一直有的,所以现在还做不了什么动作)
然后merge, identifier 用这个合并出的id 和 year
foreach i of numlist 1/7 {
merge 1:1 id year using tab`i', nogenerate
}
nogenerate就是不生成_merge这个合并结果dummy
全部操作如下:
foreach i of numlist 1/2{
        import excel using hos.xls, firstrow sheet("Sheet`i'") clear
        rename provincename prov
        rename hospitalname hos
        rename expenditure exp
        rename revenue rev
        rename suryea year
        egen id=concat(prov hos), punct("-")
        drop prov hos
        order id year exp rev
        save svy`i',replace
}
如果在此前提下:每年: 每家省市医院 id=prov+hos,只有一条记录。年支出、年收入, 或者之前处理的时候duplicates drop一下:
use svy1,clear
foreach i of numlist{
* 用两个identifier: year 和 id,nogenerate 不生成_merge显示合并结果的dummy
  merge 1:1 year id using svy`i', nogenerate
}
sort id year
bysort id: gen n=_N
drop if n!=7

每家省市医院如果7年下都有数据的话,那么应该名下有7条记录,所以数数,然后drop掉那些不等于7的,
剩下的就应该是7年内存活下来的医院了。
split id, parse("-")
rename id1 prov
rename id2 hos
drop id n
order year prov hos
sort year prov hos

是否解决了问题?
已有 1 人评分热心指数 收起 理由
np84 + 1 热心帮助其他会员

总评分: 热心指数 + 1   查看全部评分

不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

7
tatarose 发表于 2012-12-28 10:15:19
monstersivle 发表于 2012-12-28 00:15
不客气。
好,7年数据,每年的数据做以下处理
因为同一所医院在好几个省都有分院,等于说其实观测值的识别 ...
厉害,问题完全解决了,太感谢了!

8
monstersivle 发表于 2012-12-28 10:51:28
tatarose 发表于 2012-12-28 10:15
厉害,问题完全解决了,太感谢了!
那太好了,不客气。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

9
monstersivle 发表于 2012-12-30 05:22:22
https://bbs.pinggu.org/thread-2165446-1-1.html

生成id有个更便捷的办法:
egen id=group(prov hos)
后:

merge 识别符可为varlist,所以不用生成个新的组变量

forv i=1/2{
        import excel using hos.xls, firstrow sheet("Sheet`i'") clear
        rename suryea year
        rename provincename prov
    rename hospitalname hos
        rename expenditure exp
        rename revenue rev
        sort year prov hos
        duplicates drop
        save svy`i',replace
}
use svy1,clear
forv i=1/2{
        merge 1:1 year prov hos using svy`i', nogenerate
}
sort year prov hos
* 以下操作当每年prov hos只有一个观测值得情况下才可行
qui distinct year
bysort prov hos: gen n=_N
drop if n!=`r(ndistinct)'
drop n

不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

10
aihen 发表于 2013-2-2 12:06:23

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-28 16:58