2017-08-14 22 views
0

私は、サンプル構築中に落とした観測数を記録する自動Excelファイルを作成しようとしています。putexcelと単純なプログラムを使用しています。Stataプログラミングとputexcelループ

私はプログラミングには新しく、以下のプログラムは仕事をしています。 1)観測数の減少、2)観測データの欠落、3)データセットに残った観測数、4)観測結果を削除する理由を説明する文字列が表示されます。

結果をExcelにエクスポートするには、putexcelコマンドを使用します。これはうまくいきます。問題は、私がdofileに何度も観測を落とす必要があることと、putexcelの部分を何らかの形でプログラムに組み込んで、それをセルの上にループさせることができるかどうかということでした。

つまり、最初にA1に、2回目にA8に自動的に説明($ 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

これで問題はStataのが充填されているではありませんしているかのセルを知らないということですので、私はそれはおそらく含めるするのが最も簡単だと思いますプログラムを実行した回数を示すprogram defineの別の引数です。ここで

は一例です:変更は、その後、我々はその数に基づいて行にputexcelコマンドを追加し、すでにdropdataで3番目の引数として行われる呼の数を含めることであることを

** 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 

注意。余談として

、彼らがより安全だから、私は地元の人々にあなたのグローバルのすべてを変えました。あなたが書くプログラムからのマクロを返すようにしたい場合にも、一般的に、あなたは、例えばrclass、プログラムがあるのStataを伝えた後、以下のようなステートメントを使用します。

program define return_2, rclass 
    return local asdf 2 
end 

、その後、あなたはローカルにアクセスすることができますasdf(2に等しい)をローカルr(asdf)とし、プログラムによって返されたすべてのローカルの値をコマンドreturn list

でチェックすることができます
関連する問題