从以下玩具箱数据开始:
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
变量进行排序?
此处不需要新数据集。您想要列出的只是现有变量的一对一映射,最高频率(第一个变量)的类别映射到新变量的最低值,等等。因此,两个新变量就足够了。
* 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)在这里很方便:请参阅本文进行讨论并search labmask, sj
获取下载位置。
一旦第一个变量具有值标签,这些标签就是encode
第二个变量想要的标签。
如果你还想要一个新的数据集,那么
contract YEAR?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句