在Stata中循环中删除各种字符串变量

时间:2015-01-13 20:48:26

标签: string loops stata

我想要一个drop大量的字符串变量,其中包含单词" Other"在他们的观察中。因此,我尝试了以下循环到drop所有变量:

foreach var of varlist v1-v240 { 

drop `var' if  `var'=="Other"

}

我得到的回答是#34;语法错误"。我不仅想知道一种方法来执行删除包含单词" Other"的所有变量的任务,还要知道为什么我输入的代码会返回错误。

2 个答案:

答案 0 :(得分:4)

@Dimitriy Masterov没有详细解释为什么你的语法非法的简短回答是drop只支持两种语法,它们不能混合,drop ping变量和drop ping观察。记录在案:见例如: http://www.stata.com/help.cgi?drop以及Stata中相应的在线帮助和手动输入。

除了其他解决方案, Stata Journal 中的findname将允许此解决方案:

findname, any(@ == "Other") 
drop `r(varlist)' 

您对包含的解释显然是'等于'判断您使用==作为运算符,如上所述。如果包含实际上意味着'包含为子字符串',那么您需要一种语法,例如

any(strpos(@, "Other"))  

any(regexm(@, "Other"))  

正如@Dimitriy所解释的那样。

答案 1 :(得分:3)

如果它们是实际的字符串,这应该有效:

sysuse auto, clear

ds, has(type string) // get a list of string variables

// loop over each string variable, count observations that contain Buick anywhere, and drop the variable if N>0
foreach var of varlist `r(varlist)' {
    count if regexm(`var',"Buick") 
    if r(N)>0 {
        drop `var'
    }
}

如果“包含”表示只包含 ,则需要使用“^ Buick $”或

count if `var'=="Buick"

小心前导/尾随空格。

if限定符将命令的范围限制为表达式值为true的那些观察值。您的代码错误,因为如果某些观察(行)满足条件,您要求Stata删除变量(列)。您可以使用if 限定符删除这些观察结果,也可以删除变量,但不能同时删除它们。我的代码使用if 命令(一个不同的野兽)来验证条件,然后在满足条件的情况下删除变量。

你可能想做类似

的事情
if `var'=="Other" {
 drop `var'
}

但这通常不会按预期工作(只有在第一次观察是“其他”时才会删除变量。)