String 在Stata中的循环中删除各种字符串变量
我想删除大量字符串变量,这些变量在它们的观察值中包含单词“Other”。因此,我尝试了以下循环来删除所有变量: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) //
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"))