Sorting 如何创建模仿双向列表但以特殊方式排序的数据集
从以下toybox数据开始:Sorting 如何创建模仿双向列表但以特殊方式排序的数据集,sorting,stata,Sorting,Stata,从以下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"
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创建一个与选项卡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
变量进行排序?一种方式——也许不是最优雅的,但很实用——是使用egen
的rowtottal()
函数重新创建选项卡year1
命令的结果:
egen _s = rowtotal(AA BB CC DD EE)
gsort -_s
drop _s
一种方法——也许不是最优雅的,但很实用——是使用egen
的rowtotal()函数重新创建tab year1
命令的结果:
egen _s = rowtotal(AA BB CC DD EE)
gsort -_s
drop _s
这里不需要新的数据集。您想要列表化的只是现有变量的一对一映射,频率最高的类别(第一个变量)映射到新变量的最低值,等等。因此,两个新变量就足够了
* 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)在这里很方便:请参阅并搜索labmask,sj
,以获取下载位置
一旦第一个变量有了值标签,这些标签就是要对第二个变量进行编码的
如果您仍然需要一个新的数据集,那么
contract YEAR?
这里不需要新的数据集。您想要列表化的只是现有变量的一对一映射,频率最高的类别(第一个变量)映射到新变量的最低值,等等。因此,两个新变量就足够了
* 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)在这里很方便:请参阅并搜索labmask,sj
,以获取下载位置
一旦第一个变量有了值标签,这些标签就是要对第二个变量进行编码的
如果您仍然需要一个新的数据集,那么
contract YEAR?