2016-06-24 2 views
0

私はStataに約100のデータセットを持っています。私は、すべてのデータセットにわたって、薬剤aceinhibを服用している人の割合の要約表を1つ取得するために、それらのすべてをループする必要があります。私は、各データセットのテーブルを生成するコードを書くことができますが、私が欲しいのは、これらのテーブルをまとめて1つのテーブルにまとめたものです。1つのサマリーテーブルを取得するために多くのデータセットにループする

---------------------- 
aceinhib |  Freq. 
----------+----------- 
     0 | 1578935 
     1 | 138,961 
---------------------- 

---------------------- 
aceinhib |  Freq. 
----------+----------- 
     0 | 5671774 
     1 | 421,732 
---------------------- 

---------------------- 
aceinhib |  Freq. 
----------+----------- 
     0 | 2350391 
     1 | 198,875 
---------------------- 

---------------------- 
aceinhib |  Freq. 
----------+----------- 
     0 | 884,660 
     1 |  51,087 
---------------------- 

---------------------- 
aceinhib |  Freq. 
----------+----------- 
     0 | 1470388 
     1 | 130,614 
---------------------- 

私は何をしたいことは次のとおりです: - すなわち、組み合わせた結果

---------------------- 
aceinhib |  Freq. 
----------+----------- 
     0 | 11956148 
     1 | 941269 
----------------------  

これは私を与える

forval i=1/5 { 
     capture use "FILEADDRESS\FILENAME`i'", clear 
     table aceinhib    
     capture save "FILEADDRESS\NEW_FILENAME`i'", replace 
} 

:ここ

はわずか5のデータセットを使用した例です。上記の5つのテーブルのうちの1つ。

答えて

1

このパターン考えてみましょう:

scalar a = 0 
scalar b = 0 

quietly forval i = 1/1000 { 
    sysuse auto, clear 
    count if foreign 
    scalar a = scalar(a) + r(N) 
    count if !foreign 
    scalar b = scalar(b) + r(N) 
} 
gen double count = cond(_n == 1, scalar(a), cond(_n == 2, scalar(b), .)) 
gen which = cond(_n == 1, "Foreign", cond(_n == 2, "Domestic", "")) 
list which count in 1/2 

ただ、別のファイルからのカウントを累積します。実際の問題では、同じデータセットを繰り返し読み込むのではなく、ループ内の異なるファイルを読み込みます。

+0

華麗な、ありがとう。これは私のために働いた。 – user2363642

0

すべてのファイルが同じ構造の場合、tableコマンドの前に、appendを1つのファイルにまとめることができます。以下の解決策はまた、aceinhibが0/1としてコードされていることに依存します。 appendからの結果のデータファイルが大きすぎる、と関わる一切の重みがない場合、あなたが持っているとして継続して使用することができる

use "FILEADDRESS\FILENAME1", clear 

forvalues i = 2/100 { 
    append using "FILEADDRESS\FILENAME`i'" 
} 

table aceinhib 

:ファイルを追加するには余りにも大きくない場合、のような単純なものでしたtableためreplaceオプション:このアプローチは、個々の周波数のテーブルを含むデータファイルを作成することを

forvalues i = 1/100 { 
    use "FILENAME`i'", clear 
    table aceinhib, replace 
    rename table1 freq 
    save "NEW_FILENAME`i'" 
} 

use "NEW_FILENAME1", clear 
forvalues i = 2/100 { 
    append using "NEW_FILENAME`i'" 
} 

collapse (sum) freq, by(aceinhib) 
list 

注意。第三のアプローチは、各データセット内aceinhibための0/1値の累積FREQを格納するために、ループの各反復のためのマトリックスにtabの結果を格納し、別のマトリックスに追加に依存している:

mat b = (0\0) 
forvalues i = 1/100 { 
    use "`FILENAME`i''", clear 
    tab aceinhib, matcell(aceinhib`i') 
    mat aceinhib = aceinhib + aceinhib`i' 
} 
mat list aceinhib 

この私が問題に近づく方法ですが、ここには含まれていないユーザーの書いたパッケージやその他の基本的なStata機能を活用する、より洗練されたソリューションがあるかもしれません。

+0

私はループを使いたいと思っています。 – user2363642

0

おそらく、これは役に立つ方向にあなたを指摘します。

clear 
tempfile working 
save `working', emptyok 
forval i=1/5{ 
    quietly use "FILEADDRESS\FILENAME`i'", clear 
    * replace "somevariable" with the name of a variable that is never missing 
    collapse (count) N=somevariable, by(aceinhib) 
    append using `working' 
    quietly save `working', replace 
    } 
use `working', clear 
collapse (sum) N, by(aceinhib) 
list 
関連する問題