Sorting 如何创建模仿双向列表但以特殊方式排序的数据集

Sorting 如何创建模仿双向列表但以特殊方式排序的数据集,sorting,stata,Sorting,Stata,从以下toybox数据开始: clear all set obs 150 set seed 1234 foreach i in 1 2 { gen year`i' = round(runiform()*4) tostring year`i', replace replace year`i' = "AA" if year`i'=="0" replace year`i' = "BB" if year`i'=="1" replace year`i' = "CC"

从以下toybox数据开始:

clear all
set obs 150
set seed 1234
foreach i in 1 2 {
    gen year`i' = round(runiform()*4)
    tostring year`i', replace
    replace year`i' = "AA" if year`i'=="0"
    replace year`i' = "BB" if year`i'=="1"
    replace year`i' = "CC" if year`i'=="2"
    replace year`i' = "DD" if year`i'=="3"
    replace year`i' = "EE" if year`i'=="4"
}
我的最终目标是用LaTeX创建一个与
选项卡year1 year
的结果非常相似的表:

除此之外,行和列都应根据year1的单向选项卡的结果进行排序:

所以应该是这样的:

year1   BB   DD   CC   EE   AA
BB      7    7    10   6    9
DD      10   ...
CC
EE
AA
我目前正在考虑的方法是创建这种格式的数据集,第一个变量包含字符串值
BB、DD
,等等。然后使用
texsave
或其他方法将数据集导出到tex文件

我能够获取数据集,但我不知道如何按照我想要的方式对其进行排序:

contract year1 year2, f(freq)
reshape wide freq, i(year1) j(year2) string
foreach i in AA BB CC DD EE {
    rename freq`i' `i'
}
结果:

现在如何根据
year1
的单向列表结果对其进行排序?更准确地说,我如何才能以这种方式对
year1
进行排序,并以这种方式对
AA…EE
变量进行排序?

一种方式——也许不是最优雅的,但很实用——是使用
egen
rowtottal()
函数重新创建
选项卡year1
命令的结果:

egen _s = rowtotal(AA BB CC DD EE)
gsort -_s
drop _s
一种方法——也许不是最优雅的,但很实用——是使用
egen
rowtotal()函数重新创建
tab year1
命令的结果:

egen _s = rowtotal(AA BB CC DD EE)
gsort -_s
drop _s

这里不需要新的数据集。您想要列表化的只是现有变量的一对一映射,频率最高的类别(第一个变量)映射到新变量的最低值,等等。因此,两个新变量就足够了

* simpler code for sandbox 
clear all
set obs 150
set seed 1234
foreach i in 1 2 {
    gen year`i' = word("AA BB CC DD EE", 1 + round(runiform()*4))
}

* main segment 
bysort year1 : gen freq = -_N 
egen YEAR1 = group(freq year1) 
labmask YEAR1, values(year1) 
encode year2, gen(YEAR2) label(YEAR1) 
label var YEAR1 "year1"
label var YEAR2 "year2" 

tab YEAR1 YEAR2 

           |                         year2
     year1 |        BB         DD         CC         EE         AA |     Total
-----------+-------------------------------------------------------+----------
        BB |         7          7         10          6          9 |        39 
        DD |        10          9         10          6          2 |        37 
        CC |         6          8          9          4          2 |        29 
        EE |         2          3          9          5          5 |        24 
        AA |         2          6          6          2          5 |        21 
-----------+-------------------------------------------------------+----------
     Total |        27         33         44         23         23 |       150 
更详细地说:一种方法是为制表创建新的变量,其顺序是根据第一个变量的组频率。这里
egen,group()
很有帮助。曲折是

  • 您希望首先使用最高频率,而
    egen,group()
    将首先使用最低类别创建整数分组变量。因此,按否定频率排序。(或者等效地,否定
    egen,group()
    的默认结果。这比上面的解决方案多了一行。)

  • 有可能两个或两个以上的组具有相同的频率,因此我们必须进行编码以打破任何联系

  • 您希望此分组变量的值标签显示原始类别
    labmask
    (Stata Journal)在这里很方便:请参阅并
    搜索labmask,sj
    ,以获取下载位置

  • 一旦第一个变量有了值标签,这些标签就是要对第二个变量进行编码的

    如果您仍然需要一个新的数据集,那么

    contract YEAR? 
    

    这里不需要新的数据集。您想要列表化的只是现有变量的一对一映射,频率最高的类别(第一个变量)映射到新变量的最低值,等等。因此,两个新变量就足够了

    * simpler code for sandbox 
    clear all
    set obs 150
    set seed 1234
    foreach i in 1 2 {
        gen year`i' = word("AA BB CC DD EE", 1 + round(runiform()*4))
    }
    
    * main segment 
    bysort year1 : gen freq = -_N 
    egen YEAR1 = group(freq year1) 
    labmask YEAR1, values(year1) 
    encode year2, gen(YEAR2) label(YEAR1) 
    label var YEAR1 "year1"
    label var YEAR2 "year2" 
    
    tab YEAR1 YEAR2 
    
               |                         year2
         year1 |        BB         DD         CC         EE         AA |     Total
    -----------+-------------------------------------------------------+----------
            BB |         7          7         10          6          9 |        39 
            DD |        10          9         10          6          2 |        37 
            CC |         6          8          9          4          2 |        29 
            EE |         2          3          9          5          5 |        24 
            AA |         2          6          6          2          5 |        21 
    -----------+-------------------------------------------------------+----------
         Total |        27         33         44         23         23 |       150 
    
    更详细地说:一种方法是为制表创建新的变量,其顺序是根据第一个变量的组频率。这里
    egen,group()
    很有帮助。曲折是

  • 您希望首先使用最高频率,而
    egen,group()
    将首先使用最低类别创建整数分组变量。因此,按否定频率排序。(或者等效地,否定
    egen,group()
    的默认结果。这比上面的解决方案多了一行。)

  • 有可能两个或两个以上的组具有相同的频率,因此我们必须进行编码以打破任何联系

  • 您希望此分组变量的值标签显示原始类别
    labmask
    (Stata Journal)在这里很方便:请参阅并
    搜索labmask,sj
    ,以获取下载位置

  • 一旦第一个变量有了值标签,这些标签就是要对第二个变量进行编码的

    如果您仍然需要一个新的数据集,那么

    contract YEAR?