2017-08-14 91 views
0

我正在嘗試使用putexcel和一個簡單的程序來創建一個自動化的Excel文件,該文件記錄了在構建示例期間掉落的觀察次數。Stata編程和putexcel循環

我很新的編程,但下面的程序完成這項工作。它存儲4個全局宏,每次我放棄一些觀察結果:1)丟棄的觀察數量,2)觀察到的分享數量下降,3)留在數據集中的觀察數量,以及4)描述爲什麼我放棄觀察結果的字符串。

要將結果導出爲ex​​cel我使用putexcel命令 - 它工作正常。問題是我需要在dofile中多次刪除觀察結果,我想知道是否可以將putexcel部分合併到程序中以使其在單元中循環。

換句話說,我想要的是第一次在A1中第二次自動保存描述($ why)的程序,依此類推。

我已經提供了我下面的代碼示例:

** Generate some data: 
clear 

input id year wage 
1 1 200 
1 2 250 
1 3 300 
2 1 152 
2 2 150 
2 3 140 
3 1 300 
3 2 320 
3 3 360 
end 

** Define program 
cap program drop dropdata 
program define dropdata 
    count 
    global N = r(N) 
    count if `1' 
    global drop = r(N) 
    global share = ($drop/$N) 
    drop if `1' 
    count 
    global left = r(N) 
    global why = "`2'" 
end 

** Drop if first year 
dropdata year==1 "Drop if first year" 

** Export to excel 
putexcel set "documentation.xlsx", modify 
putexcel A1 = ("$why") 
putexcel A3 = ("Obs. dropped") A4 = ("Share dropped") A5 = ("Observations left") 
putexcel B3 = ($drop) B4 = ($share) B5=($left) 

** Now drop if wage is < 300 
dropdata wage<300 "Drop if wage<300" 

putexcel A8 = ("$why") 
putexcel A10 = ("Obs. dropped") A11 = ("Share dropped") A12 = ("Observations left") 
putexcel B10 = ($drop) B11 = ($share) B12 = ($left) 

回答

1

這樣做的問題是,塔塔不知道被填補,這是什麼細胞都沒有,所以我認爲這很可能是最簡單的,包括您的program define中的另一個參數說明您運行程序的次數。

下面是一個例子:

** Generate some data: 
clear 

input id year wage 
1 1 200 
1 2 250 
1 3 300 
2 1 152 
2 2 150 
2 3 140 
3 1 300 
3 2 320 
3 3 360 
end 

** Define program 
cap program drop dropdata 
program define dropdata 
    count 
    local N = r(N) 
    count if `1' 
    local drop = r(N) 
    local share = ($drop/$N) 
    drop if `1' 
    count 
    local left = r(N) 
    local why = "`2'" 

    local row1 = `3'*7 + 1 
    local row3 = `row1' + 2 
    local row4 = `row1' + 3 
    local row5 = `row1' + 4 
    putexcel set "documentation.xlsx", modify 
    putexcel A`row1' = ("`why'") 
    putexcel A`row3' = ("Obs. dropped") A`row4' = ("Share dropped") A`row5' = ("Observations left") 
    putexcel B`row3' = (`drop') B`row4' = (`share') B`row5' = (`left') 


end 

** Drop if first year 
dropdata year==1 "Drop if first year" 0 

** Now drop if wage is < 300 
dropdata wage<300 "Drop if wage<300" 1 

注意的變化是包括已經完成在dropdata第三個參數調用的次數,那麼我們添加putexcel命令,基於該行數。

順便說一句:

我改變了所有的全局的當地人,因爲他們是更安全的。此外,在一般情況下,如果你想從你寫一個程序返回宏,你告訴Stata的程序是,例如rclass,然後使用如下語句:

program define return_2, rclass 
    return local asdf 2 
end 

,然後你可以訪問本地asdf(等於2)作爲本地r(asdf),您可以使用以下命令檢查程序返回的所有當地人的值:return list