我想要一个drop
大量的字符串变量,其中包含单词" Other"在他们的观察中。因此,我尝试了以下循环到drop
所有变量:
foreach var of varlist v1-v240 {
drop `var' if `var'=="Other"
}
我得到的回答是#34;语法错误"。我不仅想知道一种方法来执行删除包含单词" Other"的所有变量的任务,还要知道为什么我输入的代码会返回错误。
答案 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'
}
但这通常不会按预期工作(只有在第一次观察是“其他”时才会删除变量。)