2017-06-06 4 views
0

としてそれぞれに、複数に1つの変数を回すには、私は、次のデータセットがあるとします。のStata:値または0

clear 
input SubjectID DecisionID AltID my_alpha 
1 1 1 0.4 
1 1 2 0.4 
1 2 1 0.6 
1 2 2 0.6 
2 1 1 0.8 
2 1 2 0.8 
2 2 1 0.5 
2 2 2 0.5 
end 

私はmy_alphaの値に依存AltIDの各値に対して新しい変数を作成したいです。このシナリオでは、AltID_alpha_1AltID_alpha_2になります。 AltID_alpha_1は、AltIDがであり、そうでない場合は0に等しいとき、my_alphaに等しくなります。同様に、AltID_alpha_2は、AltID2に等しく、それ以外は0に等しいとき、my_alphaに等しくなります。つまり、次のようになります。

| 件名 | DecisionID | AltID | my_alpha | alpha_AltID_1 | alpha_AltID_2 |
| 1 ------------ | 1 ------------ | 1 ----- | 0.4 -------- | 0.4 --------------- | 0 ----------------- |
| 1 ------------ | 1 ------------ | 2 ----- | 0.4 -------- | 0 ----------------- | 0.4 --------------- |
| 1 ------------ | 2 ------------ | 1 ----- | 0.6 -------- | 0.6 --------------- | 0 ----------------- |
| 1 ------------ | 2 ------------ | 2 ----- | 0.6 -------- | 0 ----------------- | 0.6 --------------- |
| 2 ------------ | 1 ------------ | 1 ----- | 0.8 -------- | 0.8 --------------- | 0 ----------------- |
| 2 ------------ | 1 ------------ | 2 ----- | 0.8 -------- | 0 ----------------- | 0.8 --------------- |
| 2 ------------ | 2 ------------ | 1 ----- | 0.5 -------- | 0.5 --------------- | 0 ----------------- |
| 2 ------------ | 2 ------------ | 2 ----- | 0.5 -------- | 0 ----------------- | 0.5 --------------- |

問題は、私の実際のデータでは、私はよく万人以上の観察、AltIDための5151個の値、および(最低でも)my_alphamy_betaの両方のための変数を作成する必要があるということです。私はこれを「迅速に」行う方法が必要です。

私はforeachループを使用して変数を作成しようとしましたが、20時間実行した後は切り捨てる必要がありました(デスクトップには24 GBのRAMがあります)。私はquietly tab AltID, gen(alpha_AltID_)というコマンドを使って0を適切な場所に入れ、1のどこかに数秒しかかからなかったのですが、私は1のすべてを正しい値に置き換えるループが必要です現在のペースで約2時間かかります。誰かが時間効率のよいソリューションを持っていますか?

+0

あなたの最初のリストを編集しました。これは意味がありますが、無関係の文字が含まれているため、インポートに便利です。 –

答えて

0

あなたの例でこれを行うには、2通りの方法があります。

clear 
input SubjectID DecisionID AltID my_alpha 
1 1 1 0.4 
1 1 2 0.4 
1 2 1 0.6 
1 2 2 0.6 
2 1 1 0.8 
2 1 2 0.8 
2 2 1 0.5 
2 2 2 0.5 
end 

gen alpha_AltID_1 = cond(AltID == 1, my_alpha, 0) 
gen alpha_AltID_2 = cond(AltID == 2, my_alpha, 0) 

separate my_alpha, by(AltID) 
mvencode my_alpha?, mv(0) 

list AltID *alpha*, sep(0) 

    +--------------------------------------------------------------+ 
    | AltID my_alpha alpha_~1 alpha_~2 my_alp~1 my_alp~2 | 
    |--------------------------------------------------------------| 
    1. |  1   .4   .4   0   .4   0 | 
    2. |  2   .4   0   .4   0   .4 | 
    3. |  1   .6   .6   0   .6   0 | 
    4. |  2   .6   0   .6   0   .6 | 
    5. |  1   .8   .8   0   .8   0 | 
    6. |  2   .8   0   .8   0   .8 | 
    7. |  1   .5   .5   0   .5   0 | 
    8. |  2   .5   0   .5   0   .5 | 
    +--------------------------------------------------------------+ 

実際のケースはどうですか? separate/mvencodeメソッドが機能するはずです。だから、これはあなたのIDは1から5151まで行けば必要があります。

forval j = 1/5151 { 
    gen alpha_AltID_`j' = cond(AltID == `j', my_alpha, 0) 
} 

あなたのIDはそれほど行儀されていない場合は、どのように教えてください。

あなたが報告する限り、ループコードに時間がかかるとは思えませんが、コードを表示しないので詳細なコメントは難しいです。

何故、何千もの変数をマップする必要があるのですか?