【问题标题】:How to find a common variable in a large number of databases using Stata如何使用Stata在大量数据库中查找公共变量
【发布时间】:2016-06-29 11:17:16
【问题描述】:

所以我在 Stata 中有大量数据库(82 个),每个数据库包含大约 1300 个变量和数千个观察值。其中一些数据库包含给出某些概念的平均值或标准偏差的变量。例如,此类数据集中的变量可以称为“leverage_mean”。现在,我想知道哪些数据集包含名为 concept_mean 或 concept_sd 的变量,而无需手动检查每个数据集。

我在想也许有一种方法可以遍历数据库以查找包含“mean”或“sd”的变量,不幸的是我知道如何做到这一点。我正在使用 R 和 Stata 数据文件。

【问题讨论】:

标签: r database variables stata


【解决方案1】:

是的,您可以使用 stata 和 R 中的循环来执行此操作。首先,您应该查看 stata 命令ds 和包findname,它们将执行此处描述的许多事情以及更多.但是为了向您展示“幕后”发生的事情,我将在下面展示可以实现此目的的 Stata 代码:

/*Set your current directory to the location of your databases*/
cd "[your cd here]"

使用 stata 的宏 dir 函数将 82 个数据库的名称保存到名为“filelist”的列表中。注意:你没有指定你的数据库文件是什么类型的文件,所以我假设 .xls。此命令将所有扩展名为“.xls”的文件保存到列表中。您保存到列表中的文件类型以及导入数据库的方式将取决于您正在读取的文件类型。

local filelist : dir . files "*.xls"

然后遍历所有文件以显示哪些文件包含以“_sd”或“_mean”结尾的变量。

foreach file of local filelist {
    /*import the data*/
    import excel "`file'", firstrow clear case(lower)

    /*produce a list of the variables that end with "_sd" and "_mean"*/

    cap quietly describe *_sd *_mean, varlist
    if length("r(varlist)") > 0 {

    /*If the database contains variables of interest, display the database file name and variables on screen*/

        display "Database `file' contains variables: " r(varlist)
    }
}

最后请注意,此循环将仅显示数据库名称和其中包含的感兴趣的变量。如果您想对数据执行操作或执行其他任何操作,则需要将这些操作包含在最终“显示”命令的位置(您可能最终实际需要也可能不需要)。

【讨论】:

  • 我明白了,在 R 中会是同样的想法吗?可以展示给我吗?抱歉,我是新手。
  • 所以在 R 中我试过这个: (f
  • 我会尝试使用函数list.files() 然后在该列表上使用apply() 来构建文件列表。我对 R 不太熟练,而且我还没有测试过该代码,所以让我知道它是怎么回事......
  • 函数names() 将为您提供数据中包含的变量列表。如果您确实更喜欢 R 中的答案,您可能需要考虑稍微修改一下您的问题。
  • 所以我现在得到了这个: temp = list.files(pattern="*.dta") 然后我做 for (i in 1:length(temp)) assign(temp[i], read .dta13(temp[i])) 并使用 grep(pattern="_m", temp, value=TRUE),但这给了我包含 _m 的文件名,但是我想要以 _m 结尾的变量名和它们的数据集'在
【解决方案2】:

您可以使用filelist(来自 SSC)创建文件数据集。要安装filelist,请在 Stata 的命令窗口中输入:

ssc install filelist

使用内存中的数据集列表,您可以循环遍历每个文件并使用describe 获取每个文件的变量列表。您可以将此变量列表存储在单个字符串变量中。例如,以下将收集 Stata 附带的所有 Stata 数据集的名称,然后为它们包含的每个变量存储:

findfile "auto.dta"
local base_dir = subinstr("`r(fn)'", "/a/auto.dta", "", 1)

dis "`base_dir'"
filelist, dir("`base_dir'") pattern("*.dta")

gen variables = ""
local nmatch = _N
qui forvalues i = 1/`nmatch' {
    local f = dirname[`i'] + "/" + filename[`i']
    describe using "`f'", varlist
    replace variables = " `r(varlist)' " in `i'
}
leftalign  // also from SSC, to install: ssc install leftalign

一旦您在内存中的数据中获得了所有这些信息,您就可以轻松地搜索特定变量。例如:

. list filename if strpos(variables, " rep78 ")

     +-----------+
     | filename  |
     |-----------|
 13. | auto.dta  |
 14. | auto2.dta |
     +-----------+

【讨论】:

    【解决方案3】:

    lookfor_all 包 (SSC) 就是为此目的而存在的:

    cd "pathtodirectory"
    
    lookfor_all leverage_mean
    

    只要确保文件扩展名是小写(.dta)而不是大写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多