循环遍历几个Stata文件

时间:2015-12-04 21:13:02

标签: stata

我有大约40个g1, g2, ..., g6个文件,所有文件都包含相同的变量但是针对不同的观察单位。我想使用Stata遍历我拥有所有40个文件的目录,以执行以下操作:

  1. 将每个文件加载到Stata中,然后导出到Excel工作表中。这个想法是有一个Excel工作簿,有40张 - 每个.dta文件一个。

  2. 在40个文件中的每个文件中,计算名为.dta的变量的不同观察数的数量。输出可以保存到与1不同的Excel表格中。但我可以提供建议。

  3. 我之前从未使用car_type或循环,所以任何帮助都会非常感激。我知道,对于第1步,我可以为local编写一个do文件,然后为每个文件编写use "C:\File1.dta,但我不想手动重复此文件每个文件都有一个。

1 个答案:

答案 0 :(得分:1)

您可以将此作为模板开始使用:

set more off

/* (A) Create 5 Fake Datasets file1,...,file5 */ 
sysuse auto, clear

forvalues i=1/5 {
    preserve
        keep if rep78==`i'
        tab rep78
        save "file`i'.dta", replace
    restore
}


/* (B) Export Fake Files to Excel */
capture erase "my_excel_file.xls" // erase Excel file if it exists

ssc install distinct
ssc install fs

fs "file*.dta" // get a list of files to export to Excel

/* loop over this list, opening each one, calculate distinct values, and put the data below that */
foreach f in `r(files)' {
    quietly {
        use "`f'", clear
        distinct make
        generate distinct_vals_of_make = r(ndistinct) in 1
        export excel distinct_vals_of_make using "my_excel_file", sheet("`f'") firstrow(variables) cell(A1)
        drop distinct_vals_of_make
        export excel using "my_excel_file", sheet("`f'", modify) firstrow(variables) cell(A4)
    }
}

shell open "my_excel_file.xls"

<强>数目:

r(files)是包含fs返回的文件列表的本地宏的名称。当您使用后引号和结束引号括起名称时,r(文件)将吐出该列表。 &#34; foreach f in&#34;只是一种在顺序循环遍历它们时引用该列表的每个元素的方法。你可以写&#34; foreach file_name in&#34;同样如此。每次循环迭代时,将重新定义f(或file_name)以包含下一个文件,该文件可以使用后引用加上f加上结束引号获得。 in 1表示Stata数据集的第一行。

最后,我认为你可以用

做到这一点
   /* loop over this list, opening each one, calculate distinct values, update the stats sheet, and put the data in a seprate sheet */
/* Initialize the names */
gen file_name=.
gen distinct_vals_of_make=. 
export excel file_name distinct_vals_of_make using "my_excel_file", sheet("stats") firstrow(variables)
local j=2

foreach f in `r(files)' {
    quietly {
        use "`f'", clear
        gen file_name = "`f'" in 1  
        distinct make
        generate distinct_vals_of_make = r(ndistinct) in 1
        export excel file_name distinct_vals_of_make using "my_excel_file", sheet("stats", modify) cell(A`j')
        local ++j

        drop distinct_vals_of_make file_name
        export excel using "my_excel_file", sheet("`f'") firstrow(variables)
    }
}