在 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 变量和 drop
ping 观察。这是记录在案的:参见例如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 也解释的那样。
我想要 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 变量和 drop
ping 观察。这是记录在案的:参见例如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 也解释的那样。