2017-06-06 69 views
0

假設我有以下數據集:塔塔:打開一個變量爲多個,每個爲價值或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。當AltID1時,AltID_alpha_1將等於my_alpha,否則等於0。類似地,當AltID等於2時,AltID_alpha_2將等於my_alpha,否則等於0。也就是說,它應該看起來像這樣:

| SubjectID | 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,這似乎是大約需要兩個小時(以目前的速度)。有沒有人有更省時的解決方案?

+0

我編輯了你的第一個列表,這是有道理的,但包含不相關的字符,更方便的導入。 –

回答

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 

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不是那麼好行爲,那麼告訴我們是多麼的如此。

很難相信只要您報告任何循環代碼就會花費時間,但由於您沒有向我們顯示代碼,所以詳細的評論是困難的。

所有這些說,你爲什麼需要一個變量映射到數千?