我有几个不同的数据集,每个我只需要保留一个变量列表。但是,当我运行一个简单的keep
命令时,我最终会出现错误,因为并非我提供的列表中的所有变量都存在于每个数据集中。有没有一种简单的方法可以解决这个问题,比如keep
我错过的选项?如果没有,有没有办法为每个数据集我可以将keep
中的varlist定义为只有当前数据集中存在的主列表中的varlist?
谢谢大家。我刚刚开始使用Stata(以前的R),所以有时候我仍然坚持看R的方式。我很感激任何提示。
答案 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所示。
其他选项涉及describe
和unab
(可从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
}