2017-08-28 12 views
2

私はによって作成されたデータがあるとし、次のは、マトリックス中のタブの結果をソートする方法

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' = "Super Low" if year`i'=="0" 
    replace year`i' = "Kinda Low" if year`i'=="1" 
    replace year`i' = "Average to Mediocre" if year`i'=="2" 
    replace year`i' = "Pretty High" if year`i'=="3" 
    replace year`i' = "Incredibly High" if year`i'=="4" 
} 

私は最終的にの割合で周波数が、パーセンテージ、および相違点を提示し、ラテックス中のテーブルを作成したいですこれらの2つの変数。重要なことは、私はこれらの線に沿って1

何か年に周波数によってそれをソートしたいと思います: enter image description here

それは難しい私が予想より行うことを見つける、私は次のコードを思いついた(感謝https://www.statalist.org/forums/forum/general-stata-discussion/general/1124796-any-way-to-save-row-percentages-output-as-a-matrix) :

label define order 1 "Pretty High" 2 "Average to Mediocre" 3 "Kinda Low" 4 "Incredibly High" 5 "Super Low" 

foreach i in 1 2 { 
    encode year`i', gen(y`i'_freq) label(order) 
    tab y`i'_freq, matcell(y`i'_freq) 
    mata: st_matrix("y`i'_pct", (st_matrix("y`i'_freq") :/ colsum(st_matrix("y`i'_freq")))) 
} 

matrix combined = y1_freq, y1_pct 
foreach i in 2 { 
    matrix combined = combined, y`i'_freq, y`i'_pct 
} 

mata: st_matrix("c", (st_matrix("combined"), st_matrix("combined")[.,2] - st_matrix("combined")[.,4])) 

matrix rownames c = "Pretty High" "Average to Mediocre" "Kinda Low" "Incredibly High" "Super Low" 
matrix colnames c = "No. 1 Freq" "No. 1 Pct" "No. 2 Freq" "No. 2 Pct" "Difference" 
esttab matrix(c), nomtitles 

上記の問題は、変数のソートをハードコードしていることです。自動的に行われるようにこれを一般化するにはどうすればよいですか?

私のコードを改善するための他のヒントもありがとうございます。

+1

'matrix combined = y1_freq、y1_pct、y2_freq、y2_pct'は3行を節約します。 –

答えて

2

contractmergeの2年間という簡単なソリューションを使用することをお勧めします。あなたの最初のコードを実行した後、この:

foreach i in 1 2 { 
    preserve 
    contract year`i', f(freq`i') p(pct`i') 
    tempfile year`i' 
    save `year`i'' 
    restore 
} 

use `year1', clear 
ren year1 year2 
merge m:m year2 using `year2', nogen 
ren year2 type 
gsort -freq1 
replace pct1 = pct1/100 
replace pct2 = pct2/100 
gen diff = pct1 - pct2 
list, clean 

これは、あなたの結果が得られます:

     type freq1 pct1 freq2 pct2  diff 
    1.    Kinda Low  39 0.26  27 0.18   .08 
    2.   Pretty High  37 0.25  33 0.22 .0266667 
    3. Average to Mediocre  29 0.19  44 0.29   -.1 
    4.  Incredibly High  24 0.16  23 0.15 .0066667 
    5.    Super Low  21 0.14  23 0.15 -.0133333 

備考:

contractは、現在のデータセットをクリアし、周波数およびパーセンテージでデータセットを作成しますyear'i'。データセットは一時ファイルに保存され、ファイルシステムをきれいに保ち、ファイルを削除する心配はありません。

次に、最初のデータセットが2番目のデータセットとマージされます。第2のデータセットの頻度とパーセンテージのみが保持されます。

降順でソートするには、gsort -freq1コマンドを使用します。昇順でソートするには、gsort freq1を実行してください。

+0

ありがとうございました - それは私が持っていたものよりずっと簡単です! – bill999

+0

この時点で、現在のデータセットをLaTeXにエクスポートする最も簡単な方法は何ですか? – bill999

+1

うれしかった! ジョブを実行するパッケージ '-dataout-'があります。これらを実行してLaTeXにデータセットをエクスポートしてください: 'ssc install dataout'と' dataout、save(myfile)tex replace' –

3

これは、@Andrey Ampilogovによる以前に投稿された回答のバリエーションです。私は強調します技術の

* sandbox code from OP 
clear all 
set obs 150 
set seed 1234 
foreach i in 1 2 { 
    gen year`i' = round(runiform()*4) 
} 

preserve 

stack year1 year2, into(year) clear 
contract year _stack, f(freq) p(percent) 
reshape wide freq percent, i(year) j(_stack) 

* define labels once when needed 
label define year 0 "Super Low"  /// 
    1 "Kinda Low" 2 "Average to Mediocre" /// 
    3 "Pretty High" 4 "Incredibly High" 
label val year year 

gsort -freq1 
list 

    +-----------------------------------------------------------+ 
    |    year freq1 percent1 freq2 percent2 | 
    |-----------------------------------------------------------| 
    1. |   Kinda Low  39  13.00  27  9.00 | 
    2. |   Pretty High  37  12.33  33  11.00 | 
    3. | Average to Mediocre  29  9.67  44  14.67 | 
    4. |  Incredibly High  24  8.00  23  7.67 | 
    5. |   Super Low  21  7.00  23  7.67 | 
    +-----------------------------------------------------------+ 

    restore 

のポイントは、あなたが整数を維持したときに便利な値ラベルを添付することができたときに、より良いアイデアを思われない文字列に整数値を変換

  1. です。注文情報を復元するには、元の定義を参照する必要があります。

  2. merge m:mはStataによってサポートされていますが、動作しても過度に機能します。精巧なファイル・コレオグラフィーは必要ありません。

  3. 私の場合、パーセントはこのような問題では0と100で境界が定められています。しかし、適切なデータ構造を使用すると、比率にスケーリングして差異を計算するのは簡単です。

+0

もう少し明確化していただきありがとうございます、ニック。それは '-stack-'コマンドについて学ぶよい方法です –

関連する問題