【问题标题】:How to retrieve data from multiple Stata files?如何从多个Stata文件中检索数据?
【发布时间】:2013-05-27 22:57:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: stata multiple-databases


    【解决方案1】:

    这里首先想到的是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 |
         +-----------------+
    

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

    【讨论】:

    • 非常感谢...我试过了...但仍然得到post mypost not found。我尝试创建mypost.dta...仍然是同样的错误。 mypost.dta 是目标文件吗?
    • 您将不得不发布您尝试过的代码。否则我只能建议你有语法错误。
    • 我已经添加了我在上面的问题中尝试过的代码......评论部分的布局不好......
    【解决方案2】:

    另一种方法是循环文件并使用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
    

    【讨论】:

    • 这是一个很好的方法并且可能更容易理解。正如 Maarten 高兴地强调的那样,它严格限于 collapse 可以做的事情。但如果你喜欢这条路线,还要注意contract
    【解决方案3】:

    请注意,如果您的数据集不是按顺序命名的,例如 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 中。

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2013-05-16
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多