You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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*

另外,你之前统计非重复变量个数的代码也可以优化一下,用egenrownonmiss结合去重逻辑会更简洁,不过如果你的需求已经满足,也可以不用改~

备注:内容来源于stack exchange,提问作者Lennart Osses

火山引擎 最新活动