在上一篇文章中,講解了如何在Excel中使用putexcel命令寫出簡單的表達式并且實現文本和單元格的布局。今天,我們講解一下如何寫出更復雜的表達式,比如宏,圖表和矩陣。甚至是如何在Excel中通過編寫公式來創建計算單元。在Excel中,這些是我們實現報表自動生成的重要步驟。
在開始講解案例前,我先創建一個putexcel2.xlsx的單獨文件,并把每個案例寫到單獨的工作表中。putexcel set命令如下:
我可以為每個案例創建一個獨立的Excel文件,但是我更喜歡一個文件中包含多個工作表。當你創建大型報表的時候我想你也會喜歡使用這種方法。
輸入webuse nhanes2可以下載案例中所需的數據集。我將使用數據集的子集并且重新標記一些變量,所以不必介意你的數字是否與我的完全一致。
案例1將返回結果寫入Excel
STATA的很多命令可以返回標量,宏和矩陣。我們可以使用putexcel命令將這些寫到一個Excel表中。比如,我可能想把年齡的平均值寫到Excel里,那么我可以在summarize age之后輸入return list來查看返回結果列表。這時平均值被保存在標量r(mean)中。
設置putexcel2.xlxs中“example 1”工作表的目標文件,然后可以在單元格A1中寫入表達式"Mean Age = ",在單元格B1中寫入表達式`r(mean) '。注意r(mean)要用單引號括起來。這是告訴STATA我想把r(mean)值寫在單元格B2中。
打開生成的Excel文件,發現平均值已經成功的寫到了單元格B2中。
案例2:用Excel格式格式化數字
可以使用Excel格式中的nformat()選項來指定一個數字的顯示格式。比如,可以使用nformat(“#.###”)這個選項使平均值顯示到小數點后三位。
可以在[P]putexcel advanced選項部分查看到Excel格式選項的完整描述。
案例3:用STATA設計數字格式
STATA包含許多快捷格式代碼可與nformat()一起使用。比如,可以使用number_d2選項使平均值顯示到小數點后兩位。
可以在附錄[P]putexcel中查看完整的數字格式代碼表。
案例4:用string()功能格式化數字
我也可以讓平均值和標準偏差輸出在一個單元格內。這個功能可以通過2個步驟實現。首先,將r(mean)和r(sd)分別保存在本地宏meanage和sdage中。string()功能允許我指定到小數點后一位。第二步,創建一個名為meansd的本地宏,將meanage和sdage合并成一個表達式。注意使用putexcel B1 = “`meansd'”命令時必須使用雙引號,因為meansd是一個字符串。
案例5:在Excel文檔中添加圖表
我可能希望我的Excel文件中包含一個年齡的柱形圖。首先,創建一個柱形圖并且使用graph export命令將圖表保存成 .png格式文件。
然后,使用picture(age.png)表達式將圖表放到表格中。
案例6:為Excel編寫矩陣
一些STATA命令可以返回矩陣。比如,我可以使用tabstat計算變量列表的描述性統計。Save選項會告訴tabstat將結果保存為矩陣。
當輸入teturn list命令時,會看到tabstat返回矩陣r(StatTotal)。
我更愿意創建一個Excel表,看起來像是從summarize輸出的行的變量和列的統計。所以我創建了一個名為results的矩陣,等同于對r(StatTotal)進行置換。
然后使用matrix(results)表達式在Excel中寫入矩陣results。我使用matrix(r(StatTotal)’)表達式,而不是去創建一個新的矩陣,在寫入Excel之前我想向你們展示轉置矩陣。矩陣的左上角將放在Excel表格的A1單元格中。names選項告訴putexcel運用矩陣寫入Excel行和列的名稱。nformat(number_d2)選項告訴putexcel展示矩陣到小數點后兩位。
下一步,我想排版一下Excel表格,使它看起來更像一個結果表,而不是一個矩陣。不在單元格中寫入任何內容就可以更改單元格的格式,甚至可以使用語法ul:br對單元格的范圍進行設置,ul在單元格的左上角,br在單元格的右下角。
單元格B2:B6中每個變量的樣本大小不需要顯示到小數點后兩位,所以我用nformat(number)選項使單元格B2:B6不顯示小數點后兩位。Overwritefmt選項告訴putexcel覆蓋現有的單元格格式。
然后,設置A1:A6單元格。right選項可以使單元格的內容右對齊,border(right)選項可以為單元格的右側添加邊框。
可以用類似的方法設置A1:F1單元格。hcenter選項可以使標簽水平居中對齊,border(bottom)選項可以在單元格A1:F1下方增加邊框。
最后,對B2:F6單元格的數字顯示字體加粗,使表格看起來像summarize輸出的結果。
排版后的Excel表格看起來是這樣:
案例7:將回歸系數寫到Excel中
大多數Stata回歸命令在r(table)的矩陣中返回系數表。比如,可以使用regress擬合以下線性回歸模型。
并且輸入matlist r(table)來查看系數矩陣。
r(table)包含df,crit和eform行,這些在回歸輸出時是不顯示的。我想在Excel表中復制系數表,那么我要將r(table)保存到results矩陣中,提取results的前6行,然后對results進行置換。
現在,可以將results寫入Excel文件中了。
對字體和單元格格式的一些調整使矩陣看起來更像一個系數表。
案例8:在Excel中寫入交叉表
通過使用矩陣我們同樣也可以將結果從tabulate寫入Excel中。 matcell()選項保存矩陣tabulate中的單元格數量。比如,我可以在cellcounts矩陣下面保存tabulate命令結果。
通過以下步驟可以用sex的值標簽來重新命名cellcounts的行名稱。首先,sex保存為一個數值變量,因此可以使用decode來創建一個名為sex_s字符串變量。如果sex作為字符串變量保存的話那么我們可以省略掉這一步。第二步,使用levelsof保存sex_s的層級到本地宏sexlabels中。然后,使用matrix rownames標記cellcounts行,并把標簽保存到sexlabels。
同樣的步驟,使用race值標簽來重新命名cellcounts列。
就像上面2個例子一樣可以把cellcounts寫到Excel里。
這種方法是可行的,但是Excel表中沒有行和列的合計數量。添加這個的方法就是使用formula()表達式把表中需要計算的單元格放進去。比如,putexcel下面第一行的單元格E2中放入Excel函數SUM(B2:D2)。這個就可以計算表中第一行的表格總數。下面的putexcel命令把公式放入表中計算出行和列的總量。
可以通過添加標簽和邊框直觀的區分單元格中行和列的總數。同樣也可以通過加粗字體來突出數字。
Excel表格類似于tabulate輸出的表格。
使用返回標量,宏,和矩陣,并用putexcel命令在Excel表格中重新創建的Stata輸出是很容易。案例1-7中很好的概括了任意變量,但是在案例8中我硬編碼了變量sex和race行和列的總數。