从以下玩具箱数据开始:
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
非常相似的表:
除了行和列之外,应按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
变量进行排序?
答案 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()
很有帮助。扭曲是
您希望首先获得最高频率,而egen, group()
将创建一个具有最低类别优先级的整数分组变量。因此,对否定的频率进行排序。 (或者等效地,否定egen, group()
的默认结果。这比上面的解决方案多一行。)
两个或多个组可能具有相同的频率,因此我们必须通常编码以打破任何关系。
您希望此分组变量的值标签显示原始类别。 labmask
( Stata期刊)非常方便:请参阅this paper for discussion和search labmask, sj
以获取下载位置。
第一个变量有值标签后,那些标签就是encode
第二个变量的标签。
如果您仍想要新数据集,那么
contract YEAR?