1

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

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

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

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

4

3 回答 3

4

An alternative approach is to loop over files and use collapse to "condense" these files to the relevant means, and than append these condensed files. Here is an adaptation of Nick's example:

// 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
于 2013-05-28T09:43:24.510 回答
4

这里想到的是使用postfile.

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

clear

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

现在我设置postfile. 我需要设置一个句柄,将使用什么变量,以及将使用什么文件。虽然我使用数字变量来保存文件标识符,但使用字符串变量可能更典型。此外,循环文件名可能比这更具挑战性。fsfrom SSC 是一个方便的命令,可帮助将一组文件名放入本地宏中;此处未说明其用途。

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

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

于 2013-05-27T23:46:07.247 回答
1

请注意,如果您的数据集不是按顺序命名的,如test1.dta, test2.dta, ..., test53.dta,而是像results-alaska.dta, result_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
}

这是一个更高级的本地宏,请参阅帮助扩展宏功能。另请注意,Stata 将生成一个列表,该列表看起来像"results-alaska.dta" "result_in_alabama.dta" "wyoming data.dta"文件名周围的引号,因此当您调用 时use,您必须将文件名括在复合引号中。

于 2014-04-08T17:41:58.823 回答