Loops 使Stata命令“生效”;删除“;即使找不到变量也要继续
我有一套18个Stata数据文件(每年一个),其名称为:Loops 使Stata命令“生效”;删除“;即使找不到变量也要继续,loops,foreach,stata,Loops,Foreach,Stata,我有一套18个Stata数据文件(每年一个),其名称为: {aindresp.dta, bindresp.dta, ... , rindresp.dta} 我想从每个数据集中消除一些变量。为此,我想使用一个事实,即数据集中的许多变量都有相同的名称,加上数据集前缀(a、b、c、…r)给出的前缀。例如,变量rach12在数据集aindresp.dta中被称为arach12,等等。因此,为了清理每个数据集,我运行如下循环: clear all local list a b c d e f g h i
{aindresp.dta, bindresp.dta, ... , rindresp.dta}
我想从每个数据集中消除一些变量。为此,我想使用一个事实,即数据集中的许多变量都有相同的名称,加上数据集前缀(a、b、c、…r)给出的前缀。例如,变量rach12
在数据集aindresp.dta
中被称为arach12
,等等。因此,为了清理每个数据集,我运行如下循环:
clear all
local list a b c d e f g h i j k l m n o p q r
foreach var of local list {
use `var'indresp.dta
drop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3 `var'xpchcf var'xpchc
save `var'indresp.dta, replace
}
实际的循环要大得多。我正在删除大约200个变量
问题是一些变量会随着时间的推移而改变名称,或者在几年后消失。添加了其他变量。因此,一旦找不到变量,循环就会停止。这是因为Stata中的drop
命令停止。然而,该命令没有强制它继续的选项
我怎样才能实现我的目标?我不想手动查看每个数据集。帮助捕获 您只需将
capture
放在drop
前面即可。您可以继续,但更好的做法是标记哪些数据集失败
在这个示例代码中,我假设如果没有删除任何内容,那么保存、替换
是没有意义的。基本思想是,命令失败会导致在\u rc
中可访问的非零错误代码。如果出现故障,则为正(真),否则为零(假)
一个更复杂的过程是循环相关变量,并标记未找到的特定变量
clear all
local list a b c d e f g h i j k l m n o p q r
foreach var of local list {
use `var'indresp.dta
capture drop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3 `var'xpchcf var'xpchc
if _rc {
noisily di "Note: failure for `var'indresp.data"
}
else save `var'indresp.dta, replace
}
另见
编辑:
如果您想删除
任何存在的内容,那么这应该足以解决您的问题
clear all
local list a b c d e f g h i j k l m n o p q r
foreach var of local list {
use `var'indresp.dta
capture drop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3 `var'xpchcf var'xpchc
if _rc {
di "Note: problem for `var'indresp.data"
checkdrop `var'rach12 `var'jbchc1 `var'jbchc2 `var'jbchc3
}
save `var'indresp.dta, replace
}
其中,checkdrop
类似于
*! 1.0.0 NJC 1 April 2016
program checkdrop
version 8.2
foreach v of local 0 {
capture confirm var `v'
if _rc == 0 {
local droplist `droplist' `v'
}
else local badlist `badlist' `v'
}
if "`badlist'" != "" {
di _n "{p}{txt}variables not found: {res}`badlist'{p_end}"
}
if "`droplist'" != "" {
drop `droplist'
}
end
嗯,如果命令失败,使用capture
继续迭代(作为文章的标题)。与我上一篇文章一样,我的目标是让drop
命令继续删除,即使没有找到一个变量。或者,正如您所建议的,我必须为每个变量写一个drop。是否有用户编写的命令可以删除命令行中找到的所有变量?在您的问题中,我没有看到如果出现问题,您希望做什么。标题只是“继续循环”。但是如果答案是“drop
任何存在的东西”,那么这是一个简单的程序。我将编辑上面的内容。太好了!我对Stata代码不是很了解,但您的程序是否在每个循环中临时删除变量?一点也不。在Stata中,除了再次读取数据集之外,没有其他类似的事情?是否要删除变量
?没有中间的方法,我的意思是,如果上面的代码将检查相同的原始变量子集来删除每个迭代。假设要删除的变量是a c d e f g
。如果b
不在第一次迭代数据集中,第二次迭代是否也会查找b
?这就是我对每个循环中的临时子集的意思。也许我不理解你的代码。它不是在drop命令中查找各个迭代数据集中存在的所有变量并将其保存为droplist
?