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

String 在Stata中的循环中删除各种字符串变量,string,loops,stata,String,Loops,Stata,我想删除大量字符串变量,这些变量在它们的观察值中包含单词“Other”。因此,我尝试了以下循环来删除所有变量: foreach var of varlist v1-v240 { drop `var' if `var'=="Other" } 我得到的回答是“语法错误”。我不仅想知道执行删除包含单词“Other”的所有变量任务的方法,还想知道我输入的代码返回错误的原因。如果它们是实际字符串,这应该可以: sysuse auto, clear ds, has(type string) //

我想删除大量字符串变量,这些变量在它们的观察值中包含单词“Other”。因此,我尝试了以下循环来删除所有变量:

foreach var of varlist v1-v240 { 

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

}

我得到的回答是“语法错误”。我不仅想知道执行删除包含单词“Other”的所有变量任务的方法,还想知道我输入的代码返回错误的原因。

如果它们是实际字符串,这应该可以:

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"
注意前导/尾随空格

if限定符将命令的范围限制为表达式值为true的观察值。如果某些观察值(行)满足某个条件,则要求Stata删除变量(列),从而导致代码错误。可以使用if限定符删除这些观察值,也可以删除变量,但不能同时删除两者。我的代码使用if命令(另一个beast)来验证该条件,然后在满足该条件时删除该变量

你可能会被诱惑去做类似的事情

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

但这通常不会像预期的那样起作用(只有当第一个观察结果是“其他”时,它才会删除变量)。

关于语法为什么非法的简短答案,@dimitry Masterov没有详细说明,就是
drop
只支持两个语法,不能混合,
drop
ping变量和
drop
ping观察值。记录在案:参见Stata中相应的在线帮助和手动输入

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

findname, any(@ == "Other") 
drop `r(varlist)' 
您对contain的解释显然是“等同于”的,这是通过您将
=
用作操作符来判断的,如上所述。如果contain真的表示“includes as substring”,那么您需要一个语法,如

any(strpos(@, "Other"))  


正如@Dimitry也解释的那样

我必须承认,我总是忘记调用什么
findname
,而且我自己似乎永远也找不到它。我不知道如何在这方面提供帮助。从某种意义上说,它是对ds的修订版(我对此做出了贡献),但它仍然是用户编写的,所以我不得不给它起一个不同的名字。名称
ds
最初的意思类似于“short descripe”,但现在它主要是一个用于查找哪些变量满足指定条件的命令,
findname
更进一步。我不喜欢
findvars
,而且
find
已经被使用了。如果且仅当你记得它的作者,那么《纽约大学的东西》(SSC)将作为一个提醒。
any(regexm(@, "Other"))