2016-11-17 49 views
0

我有一個變量列表,我想創建一個編號變量列表。意圖是通過reshape命令使用這些命令來創建堆疊數據集。我如何保持它們的秩序?例如,對於這個代碼使用foreach命令創建編號的變量名稱

local ct = 1 
foreach x in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 { 
    gen runs`ct' = `x' 
    local ct = `ct' + 1 
} 

當我使用reshape命令它產生的命令作爲

runs1 runs10 runs11 ... runs2 runs22 ... 

而不是期望的

runs01 runs02 runs03 ... runs26 

保留的順序是必要的,這種分析。我試圖在分配變量名稱時將前導零添加到小於10的所有ct值。

+0

我編輯你的本地宏顯示(和其他文本:保持簡潔並承擔善意)。使用縮進語法顯示,只要使用反引號與顯示Stata本地宏引用的文字反引號衝突。 (還有另一種解決方案,以避免反引號,但縮進在這裏更容易工作。) –

回答

2

生成一系列具有前導零的標識符是一個記錄和解決的問題:請參閱here

local j = 1 
foreach v in q61 q77 q99 q121 q143 q165 q187 q209 q231 q253 q275 q297 q306 q315 q324 q333 q342 q351 q360 q369 q378 q387 q396 q405 q414 q423 { 
    local J : di %02.0f `j' 
    rename `v' runs`J' 
    local ++j 
} 

請注意,我用rename而非generate。如果你之後要去變量reshape,則複製內容的勞動是不必要的。實際上,generate使用的數字變量的默認float類型在某些情況下可能導致精度損失。

我注意到也可能有一個解決方案rename groups

所有這一切說,很難跟蹤你對reshape做什麼(或不做)的投訴。如果您有一系列的變量,如runs*最明顯的reshapereshape long和例如

clear 
set obs 1 
gen id = _n 

foreach v in q61 q77 q99 q121 q143 { 
    gen `v' = 42 
} 

reshape long q, i(id) j(which) 

list 

    +-----------------+ 
    | id which q | 
    |-----------------| 
    1. | 1  61 42 | 
    2. | 1  77 42 | 
    3. | 1  99 42 | 
    4. | 1  121 42 | 
    5. | 1  143 42 | 
    +-----------------+ 

工作正常,我;列訂單信息被保留,完全不需要使用rename。如果我想將後綴映射到1,我可以使用egen, group()

所以,如果沒有可重複的例子,這很難討論。有關如何發佈良好的代碼示例,請參閱 https://stackoverflow.com/help/mcve

+0

尼克,我沒有想到數字格式。這很好。謝謝。我確實在尋找解決方案,但沒有發現。關於重塑的投訴,我沒有。它做它應該做的。非常感謝! – Steve

+1

注意。應該補充的是,如果你堅持使用一些(或全部)前導零的後綴,你需要''reshape'的'string'選項來保存它們! –

+0

謝謝尼克! – Steve