如何创建模仿Twoway制表的数据集,但以特殊方式排序

时间:2017-08-30 01:25:36

标签: sorting stata

从以下玩具箱数据开始:

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中创建一个与tab year1 year非常相似的表:

enter image description here

除了行和列之外,应按year1的单向选项卡的结果进行排序:

enter image description here

所以它会是这样的:

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'
}

结果: enter image description here

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

2 个答案:

答案 0 :(得分:1)

一种方式 - 也许不是最优雅但可维护的 - 是使用tab year1 egen函数重新创建rowtotal()命令的结果:

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

答案 1 :(得分:1)

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

* 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()很有帮助。扭曲是

  1. 您希望首先获得最高频率,而egen, group()将创建一个具有最低类别优先级的整数分组变量。因此,对否定的频率进行排序。 (或者等效地,否定egen, group()的默认结果。这比上面的解决方案多一行。)

  2. 两个或多个组可能具有相同的频率,因此我们必须通常编码以打破任何关系。

  3. 您希望此分组变量的值标签显示原始类别。 labmask Stata期刊)非常方便:请参阅this paper for discussionsearch labmask, sj以获取下载位置。

  4. 第一个变量有值标签后,那些标签就是encode第二个变量的标签。

    如果您仍想要新数据集,那么

    contract YEAR?