2017-08-30 23 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