如何从多个Stata文件中检索数据?

时间:2013-05-27 22:57:04

标签: stata multiple-databases

我有53个Stata .dta文件,每个文件都是150 - 200 Mb并且包含相同的变量集,但是不同年份。由于它们的大小,将它们组合或合并是没有用的。

我需要检索一些平均值(百分比等)因此,我想创建一个新的Stata文件New.dta并编写一个.do文件,该文件将在以下新的Stata文件上运行方式: 它应该打开这53个Stata文件中的每一个,进行某些计算,并将结果存储在新的Stata文件中,New.dta.

我不确定如何保持两个Stata文件同时打开,如何存储计算值?

当我打开第二个.dta文件时,如何让第一个仍然打开?如何将计算值存储在全局变量中?

3 个答案:

答案 0 :(得分:4)

这里让我想到的是使用postfile

这是一个简单的例子。首先,我设置了几个数据集的示例。你已经有了这个。

clear

forval i = 1/10 {
    set obs 100
    gen foo = `i' * runiform()
    save test`i'
    clear
}

现在我设置了postfile。我需要设置一个句柄,将使用哪些变量,以及将使用哪个文件。虽然我使用数字变量来保存文件标识符,但使用字符串变量可能更为典型。此外,循环文件名可能比这更具挑战性。来自SSC的fs是一个便利命令,可以帮助将一组文件名放入本地宏中;这里没有说明它的用途。

postfile mypost what mean using alltest.dta

forval i = 1/10 {
    use test`i', clear
    su foo, meanonly
    post mypost (`i')  (`r(mean)')
}

现在刷新结果

postclose mypost

看看我们有什么。

u alltest

list 

     +-----------------+
     | what       mean |
     |-----------------|
  1. |    1   .5110765 |
  2. |    2   1.016858 |
  3. |    3   1.425967 |
  4. |    4   2.144528 |
  5. |    5   2.438035 |
     |-----------------|
  6. |    6   3.030457 |
  7. |    7   3.356905 |
  8. |    8   4.449655 |
  9. |    9   4.381101 |
 10. |   10   5.017308 |
     +-----------------+

我这里没有使用任何全局宏(不是全局变量);你不应该这样做。

答案 1 :(得分:4)

另一种方法是循环文件并使用collapse将这些文件“压缩”到相关的方法,而不是append这些压缩文件。以下是尼克的例子:

// create the example datasets
clear

forval i = 1/10 {
    set obs 100
    gen foo = `i' * runiform()
    gen year = `i'
    save test`i', replace
    clear
}

// use collapse and append
// to create the dataset you want
use test1, clear
collapse (mean) year foo 
save means, replace
forvalues i = 2/10 {
    use test`i', clear
    collapse (mean) year foo 
    append using means
    save means, replace
}

// admire the result
list

答案 2 :(得分:1)

请注意,如果您的数据集未按顺序命名,例如test1.dtatest2.dta,...,test53.dta,而是results-alaska.dtaresult_in_alabama.dta ,...,"wyoming data.dta"(注意空格,因此引号),你必须以不同的方式组织这些文件的循环:

local allfiles : dir . files "*.dta"
foreach f of local allfiles {
   use `"`f'"', clear
   * all other code from Maarten's or Nick's approach
}

这是更高级的本地宏,请参阅help extended macro functions。另请注意,Stata将生成一个类似"results-alaska.dta" "result_in_alabama.dta" "wyoming data.dta"的列表,其中包含文件名引号,因此当您调用use时,您必须将文件名括在compound quotes中。