有没有办法只保留列表中的变量,而忽略数据集中不存在的列出变量?

时间:2015-10-14 15:59:19

标签: stata

我有几个不同的数据集,每个我只需要保留一个变量列表。但是,当我运行一个简单的keep命令时,我最终会出现错误,因为并非我提供的列表中的所有变量都存在于每个数据集中。有没有一种简单的方法可以解决这个问题,比如keep我错过的选项?如果没有,有没有办法为每个数据集我可以将keep中的varlist定义为只有当前数据集中存在的主列表中的varlist?

谢谢大家。我刚刚开始使用Stata(以前的R),所以有时候我仍然坚持看R的方式。我很感激任何提示。

3 个答案:

答案 0 :(得分:2)

我建议使用#sns_slideshow_wrapper .owl-controls { opacity: 0; transition: all 0.5s ease 0s; } #sns_slideshow_wrapper .owl-controls .owl-dots { bottom: 20px; left: 0; opacity: 0; position: absolute; right: 0; text-align: center; } 和一些扩展宏函数的组合。假设您要比较两个.dta文件,set1和set2。

然后你可以按照以下方式做点什么:

describe

这将创建一个本地宏describe set1, varlist local set1vars `r(varlist)' describe set2, varlist local set2vars `r(varlist)' local both : list set1vars & set2vars ,其中包含一个字符串,其中包含两个数据集中都存在的变量名称。在both命令中使用此宏只能keep只有两个集中存在的变量。

更全面的例子如下:

keep

请注意,在上面的示例中,您可以在数据上发出local keeplist "make mpg foreign price" /* Describe auto dataset */ describe using "C:/Program Files (x86)/Stata13/ado/base/a/auto.dta", varlist local setlist1 `r(varlist)' local keep : list keeplist & setlist1 tempfile auto use `keep' using "C:/Program Files (x86)/Stata13/ado/base/a/auto.dta" save `auto' describe using "C:/Program Files (x86)/Stata13/ado/base/a/autornd.dta", varlist local setlist2 local keep : list keeplist & setlist2 use `keep' using "C:/Program Files (x86)/Stata13/ado/base/a/autornd.dta", clear /* Do whatever you want with now similar datasets */ * i.e., merge 1:1 make using `auto' 而无需将其读入内存。根据这个逻辑,然后很容易将其合并到循环中,如@Brendan Cox所示。

其他选项涉及describeunab(可从ssc获取)。

有关该主题的更多讨论,请参阅类似问题here

答案 1 :(得分:2)

扩展ander2ed的答案,你可以定义要保留的变量的“主列表”,然后只保留来自不同数据集的匹配变量 - 例如

local keepvars = "make weight mpg length"

sysuse auto, clear // contains the four variables above (and others)
qui ds 
local dsvars `r(varlist)'
local keeplist : list keepvars & dsvars
di "`keeplist'"
keep `keeplist'

sysuse autornd, clear // contains only make, weight, & mpg
qui ds 
local dsvars `r(varlist)'
local keeplist : list keepvars & dsvars
di "`keeplist'"
keep `keeplist'

如果需要,这可以很容易地变成循环:

// loop approach
local keepvars = "make weight mpg length"
local dslist = "auto autornd"
foreach ds of local dslist {
    qui sysuse `ds', clear
    qui ds
    local dsvars `r(varlist)'
    local keeplist : list keepvars & dsvars
    keep `keeplist'
    di as input ">>> `ds'"
    ds
    // save
}

答案 2 :(得分:1)

与Brendan的答案类似,您可以使用foreach循环创建本地人。您可以使用命令isvar,但我更喜欢使用capture des并依赖返回代码。对于下面的示例,假设我们感兴趣的所有变量都是“a,b,c,d”

    forval n = 1/2{
      use data_set_`n', clear
      foreach potential_var in a b c d{
        capture qui des `a'
        if _rc == 0{
          local keep_list "`keep_list'" `a'
        }
      }
      keep `keep_list'
      save data_set_`n'_kept, replace
    }