【stata】240301stata数据合并

参考:Stata:数据合并与匹配-merge-reclink

简单合并:

*******year&city
tostring year ,gen(IND) ///把数据改成ind格式
gen yearcity=IND+city   ///合并

Stata笔记代码:

*****1. merge 命令:横向合并
sysuse auto.dta,clear
keep if _n <=5 

preserve ///将当前数据集的状态保存到内存中,以便在之后的操作中进行恢复
keep make price mpg
list, clean noobs      noobs 不显示行数;clean让输出结果更紧凑
save d1.dta,replace    
restore   ///恢复。注意!!!PRE和RES要一整段运行,不能分多次运行

preserve
keep make weight length
list, clean noobs
save d2.dta,replace //第二份数据,包括了车辆的品牌,重量以及长度
restore

use d1.dta,clear
merge 1:1 make using d2.dta //可以keepusing(weight) 来限定只合并变量 weight;
keep if _merge==3 //保留匹配成功的数据
///【_merge 】= 1 表示正在使用的数据、_merge = 2 表示合并的数据、_merge = 3 表示成功合并的数据。
drop _merge //将创建的新变量_merge删除,避免后面再次匹配时,提示变量 _merge 已被定义
list, clean noobs

*****2.append 命令:纵向合并
sysuse auto.dta,clear

preserve
keep if _n <=5 //取前5个样本
keep make price mpg
save d1.dta,replace //第一个数据,包括了车辆的品牌,价格以及公里数
restore

preserve
keep if _n >=5 & _n <=10 //取第5-10个样本
keep make price mpg
save d2.dta,replace //第二个数据,包括了车辆的品牌,重量以及长度
restore

use d1.dta,clear
append using d2.dta //【append 命令】要求两份数据具有全部相同的变量,否则就会出现缺失值。
list, clean noobs

*****3.reclink 命令:字符串的模糊匹配
*应用场景:如在第一份数据中为「Princeton University」,而在第二份数据中为「Princeton U」
*输入两份数据
clear
input str13 name str14 city 
	"Zhang ziye"  "Beijing"        
	"Liu biqian"  "Shanghai"        
	"Hu,yi"       "Guangzhou"         
	"Yang,Zhou"   "Hennan"       
end
gen id1=_n
save file1.dta, replace

clear
input str14 name str10 city  
	"Zhan, ziye"  "beijing"       
	"LIU Biqian"  "Shaanghai"        
	"huyi"        "guangdong"     
	"Zhou yang"   "henan"    
end
gen id2=_n
save file2.dta, replace 

*-模糊匹配
use file1.dta,clear
reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore)
list, clean noobs   ///matchscore 变量为匹配分数,分数越高代表匹配效果越好

*reclink 命令还允许对匹配变量设定不同权重。我们认为 city 是最重要的,则仅需增加 vmatch() 选项设定权重。赋予权重:name=1,city=15
use file1.dta,clear
reclink name city using file2.dta, idmaster(id1) idusing(id2) gen(matchscore) wmatch(1 15)
list, clean noobs

*****4. joinby 命令:多对多的匹配
*输入数据
clear
input group str3 x1
      1  "A"
      1  "B"
      1  "C"
      1  "D"
end
save file1.dta,replace

clear
input group str3 x2
      1  "M"
      1  "N"
end
save file2.dta,replace

use file1.dta
list 
use file2.dta
list ///显示数据

*merge 多对多匹配×
use file1.dta,clear
merge m:m group using file2.dta
list, clean noobs ///出问题,会用最后一行值 (比如这里的 file2.dta 的最后一行数据「group1,x2=N」) 进行重复合并,第一个匹配了M,后面全是N

*joinby 多对多匹配√
use file1.dta,clear
joinby group using file2.dta
list, clean noobs

*****5. nearmrg 命令:相似值的匹配
*生成一份数据
sysuse auto.dta, clear 
keep make price mpg
keep if make == "Toyota Celica" |    ///
        make == "BMW 320i" |         ///
		make == "Cad. Seville"  |    ///
		make == "Pont. Grand Prix" | ///
		make == "Datsun 210" 
rename make make2  //更改变量名字
save "using.dta", replace
list, clean noobs

sysuse auto.dta, clear   
///将using数据与 auto.dta 进行合并
nearmrg  using "using.dta", upper nearvar(price) genmatch(usingmatch) limit(50) 
///价格相差在正负 $50 的数据。
keep make price mpg make2 _merge usingmatch
list, clean noobs

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值