代码之家  ›  专栏  ›  技术社区  ›  bill999

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

  •  0
  • bill999  · 技术社区  · 7 年前

    从以下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"
    }
    

    我的最终目标是用乳胶创建一个与 tab year1 year :

    enter image description here

    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 ? 更准确地说,我如何排序 以这种方式订购 AA...EE

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nick Cox    7 年前

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

    * 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 discussion search labmask, sj 获取下载位置。

    encode 第二个变量。

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

    contract YEAR? 
    
        2
  •  1
  •   Brendan    7 年前

    一种方法——也许不是最优雅的,但很有用——是重新创建 tab year1 egen rowtotal()

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