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

Dropping various string variables in a loop in Stata

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

foreach var of varlist v1-v240 { 

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

}

我在 return 中得到的是答案 "syntax error"。我不仅想知道一种方法来执行删除所有包含单词 "Other" 的变量的任务,而且还想知道为什么我输入的代码 return 是错误的。

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

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'
    }
}

如果"contains"表示包含,那么您需要使用“^Buick$”代替或

count if `var'=="Buick"

注意 leading/trailing 个空格。

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

您可能会想做类似的事情

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

但这通常不会按预期工作(只有当第一个观察结果是 "Other" 时才会删除变量)。

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

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

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

你对 contain 的解释显然是 'is equal to' 从你使用 == 作为运算符来判断,如上。如果 contain 真的意味着 'includes as substring',那么你需要像

这样的语法
any(strpos(@, "Other"))  

any(regexm(@, "Other"))  

正如@Dimitriy 也解释的那样。