删除具有相似名称

时间:2017-06-02 12:54:59

标签: loops foreach stata

我必须导入并更改大量的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开头的变量(如果它们实际存在于数据中)。

1 个答案:

答案 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}的任何错误的工作如果这些变量不存在,将会提出。