Stata中同时合并并排序多个数值变量的实现问题
Stata中同时合并并排序多个数值变量的实现问题
我懂你现在的困扰啦——想把三个数值变量先按从小到大排序,再用分隔符拼接成一个新变量,但之前写的代码没实现内部排序的效果,对吧?其实你之前用的sort命令是对整个数据集的观测行进行排序,根本不是针对每个观测里的三个变量做内部排序,这就是问题所在~
下面我给你两种可行的解决思路,你可以根据自己的需求选择:
方法一:先提取每个观测的最小、中间、最大值,再拼接
这种方法逻辑直观,适合变量数量少的场景(比如你这里的3个变量):
* 1. 生成每个观测的最小、最大、中间值 egen Sic_min = rowmin(SicTwo1 SicTwo2 SicTwo3) egen Sic_max = rowmax(SicTwo1 SicTwo2 SicTwo3) egen Sic_mid = rowtotal(SicTwo1 SicTwo2 SicTwo3) - Sic_min - Sic_max * 2. 处理重复值和缺失值,转成字符串 gen str_min = string(Sic_min) if !missing(Sic_min) gen str_mid = string(Sic_mid) if !missing(Sic_mid) & Sic_mid != Sic_min // 去掉和最小值重复的情况 gen str_max = string(Sic_max) if !missing(Sic_max) & Sic_max != Sic_mid & Sic_max != Sic_min // 去掉和最小、中间值重复的情况 * 3. 拼接成目标变量,用&分隔 egen SicAndSic = concat(str_min str_mid str_max), punct("&") * 4. (可选)清理中间生成的变量 drop Sic_min Sic_max Sic_mid str_min str_mid str_max
方法二:用rowrank给每个变量内部排名,再提取排序后的值
如果以后你要处理更多变量,这种方法扩展性更好:
* 1. 给每个变量在观测内排名(1是最小,3是最大) foreach var in SicTwo1 SicTwo2 SicTwo3 { egen rank_`var' = rowrank(`var'), field } * 2. 提取排名1、2、3对应的数值 gen Sic_sorted1 = cond(rank_SicTwo1==1, SicTwo1, cond(rank_SicTwo2==1, SicTwo2, SicTwo3)) gen Sic_sorted2 = cond(rank_SicTwo1==2, SicTwo1, cond(rank_SicTwo2==2, SicTwo2, SicTwo3)) gen Sic_sorted3 = cond(rank_SicTwo1==3, SicTwo1, cond(rank_SicTwo2==3, SicTwo2, SicTwo3)) * 3. 处理重复和缺失,转字符串后拼接 gen str_sorted1 = string(Sic_sorted1) if !missing(Sic_sorted1) gen str_sorted2 = string(Sic_sorted2) if !missing(Sic_sorted2) & Sic_sorted2 != Sic_sorted1 gen str_sorted3 = string(Sic_sorted3) if !missing(Sic_sorted3) & Sic_sorted3 != Sic_sorted2 & Sic_sorted3 != Sic_sorted1 egen SicAndSic = concat(str_sorted1 str_sorted2 str_sorted3), punct("&") * 4. (可选)清理中间变量 drop rank_* Sic_sorted* str_sorted*
另外,你之前统计非重复变量个数的代码也可以优化一下,用egen的rownonmiss结合去重逻辑会更简洁,不过如果你的需求已经满足,也可以不用改~
备注:内容来源于stack exchange,提问作者Lennart Osses




