Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 使Stata命令“生效”;删除“;即使找不到变量也要继续_Loops_Foreach_Stata - Fatal编程技术网

Loops 使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

我有一套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 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