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

だから、このようなものになるだろう:私は現在、検討していますアプローチは、などの文字列値BB, DDを含む最初の変数で、この形式であるデータセットを作成することです

year1 BB DD CC EE AA 
BB  7 7 10 6 9 
DD  10 ... 
CC 
EE 
AA 

次に、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

あなたはここに新しいデータセットを必要としません。あなたが作成したいものは、既存の変数、新しい変数の最低値にマッピングされた最高頻度(最初の変数)のカテゴリなどの単なる1対1のマッピングです。したがって、2つの新しい変数で十分です。より詳細には

* 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 

:これを行う方法の1つは、順序があなたの最初の変数のグループの周波数に応じてされている集計のための新しい変数を作成することです。ここではegen, group()が役に立ちます。ツイストはegen, group()が最初に最低のカテゴリを持つ整数のグループ化変数を作成することになり、一方、あなたが最初の最高周波数が欲しい

  1. です。したがって、無効化された周波数をソートします。 (または、同等の結果として、egen, group()という既定の結果を無効にしてください)これは上記の解決策よりももう1行です。

  2. このグループ変数の値ラベルに元のカテゴリを表示します。labmaskスタータジャーナル)ここで便利です: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