2017-08-30 24 views
0

开始与以下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的表格,这是非常相似,会导致什么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变量?

回答

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. 您希望此分组变量的值标签显示原始类别。labmaskStata Journal)在这里很方便:请参阅this paper for discussionsearch labmask, sj以获取下载位置。

一旦第一个变量值标签,这些标签是什么想encode第二个变量。

如果你仍然想一个新的数据集,然后

contract YEAR? 
1

一种方式 - 也许不是最优雅,但维修 - 是重新使用egenrowtotal()功能您tab year1命令的结果:

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