我必须导入并更改大量的csv文件。在这个过程中的某个时刻,我想使用以下代码
local vlist materialcost* costofemployees* city country
foreach v in vlist{
capture drop `v'
}
但是,本地人不允许像materialcost*
这样的开放式描述
或者,如果我尝试
foreach v of var materialcost* costofemployees* city country {
capture drop `v'
}
我遇到了一个问题,因为它无法始终在名称中找到materialcost
的变量,从而引发错误。
所以我希望Stata drop
所有以materialcost
开头的变量(如果它们实际存在于数据中)。
答案 0 :(得分:2)
首先,本地人不允许像materialcost*
这样的开放式描述的陈述在事实上和原则上都是错误的。
我刚刚在Stata做过:
. local vlist materialcost* costofemployees* city country
. di "`vlist'"
materialcost* costofemployees* city country
因此,对本地的分配可以并且确实在实践中起作用。原则是本地人只是文本的容器,并且不知道该文本可能是什么(或意味着什么),超出不在这里或通常咬的长度限制。
你说的原因可能是这并不是你想要的。
foreach v in vlist {
capture drop `v'
}
该语法是合法的,但不是让foreach
处理刚定义的本地内容的方法。那个循环归结为
capture drop vlist
除非vlist
是数据集中的变量名,否则将无效。
你的主要问题是这个。如果你说
foreach v of var materialcost* costofemployees* city country {
然后,var
关键字后面的内容实际上是一个变量列表是必不可少的,foreach
会在不进入循环的情况下抛弃你,如果不是这样的话。它不会忽略异常。循环中的capture
无法提供帮助; Stata从未走得那么远。但是,我猜是
foreach v in materialcost* costofemployees* city country {
capture drop `v'
}
应该对您有用,因为(a)您没有提出可能存在哪些变量可能存在错误的声明,并且(b)capture
执行捕捉{{1}的任何错误的工作如果这些变量不存在,将会提出。