仍无解?

提一个dirty的思路吧(估计跑起来也不慢):
先:
楼主跟帖已描述清任务:
根据R变量已有值的组N的分年mv_dec和mb_quin分位标记符, 给其它组(如A、Q)的R变量复制
再:
思路:
1、只保留组N的观测值, 另存数据库N.dta。
keep if group=="N"
之后,只保留:年变量、分位标记符、R变量,去掉重复观测值,导出重命名数据集(比如:R.dta)
keep year mv_dec mb_quin R
duplicates drop
save R, replace
2、按着sungmoo版主的办法,即cumul, equal + ceil()取上界整数,分别得到它组分位标记符(十分位、五分位),分别用组名另存为数据集(比如:A.dta, Q.dta)
实现的话可:
qui levelsof group if group!="N", local(group)
foreach i of local group {...}
里面导出的时候可直接:save `i', replace具体(为检验,重思路):
qui levelsof group if group!="N",local(group)
foreach i of local group{
bys year: cumul mv if group==`i', equal gen(dec)
replace mv_dec=ceil(dec*10) if group==`i'
bys year mv_dec: cumul mb if group==`i' , equal gen(quin)
replace mb_quin=ceil(quin*5) if group==`i'
drop dec quin
save `i',replace
}
3、循环merge, A.dta跟R.dta, Q.dta跟R.dta merge, (merge有选项是直接用using的变量值覆盖掉main数据集里的,即update)
foreach i of local group{
use `i',clear
merge m:1 year mv_dec mb_quin using R, update
save `i',replace
}
4、A.dta, Q.dta append到 N.dta,
foreach i of local group{
use `i',clear
append using N
save final,replace
}
注:因需用到本地宏local macro,需整体一并执行:
以下程序经测,可行,很快跑完,请检验(怎么检验啊?)
use example,clear
keep if group=="N"
save N,replace
keep year MV_Deciles MB_Quintiles R
duplicates drop
save R,replace
use example,clear
qui levelsof group if group!="N",local(group)
foreach i of local group{
bysort year: cumul MV if group=="`i'", equal gen(dec)
replace MV_Deciles=ceil(dec*10) if group=="`i'"
bysort year MV_Deciles: cumul MB if group=="`i'" , equal gen(quin)
replace MB_Quintiles=ceil(quin*5) if group=="`i'"
drop dec quin
save "`i'",replace
}
foreach i of local group{
use "`i'",clear
merge m:1 year MV_Deciles MB_Quintiles using R, update
save "`i'",replace
}
foreach i of local group{
use "`i'",clear
append using N
save final,replace
}
sort group year MV_Deciles MB_Quintiles R
br
此法太麻烦(merge不用其它组一个一个倒腾,输出个R的nonmissing数据集,直接回来按着year MV_Deciles MB_Quintiles 定位做R的update就好了),参:楼下解(根据luckykong解法改制)
检查了此贴方法,组N的分位标记与源不一致:
use example,clear
bysort year: cumul MV if group=="N", equal gen(dec)
replace dec=ceil(dec*10) if group=="N"
bysort year dec: cumul MB if group=="N" , equal gen(quin)
replace quin=ceil(quin*5) if group=="N"
sort group year MV_Deciles MB_Quintiles
br if group=="N"
是这么个分组方法么???哪里错了???