假设我有一个具有以下名称的变量数据集(请注意x
和hm
的存根):
x9, xdog, x_99, hma8j, hm40, hm0
我想开发一种编程方式来提供变量名称列表(可能包含通配符),然后将每个变量名称循环到recode
所有小于0的值,并且缺少值{{1} })。
在实践中,我有很多列,只想要.
一些。我不想使用列索引或范围,因为我不知道它们,因为我的数据很大。
我的方法涉及以下步骤:
创建一个名为recode
的本地宏,其中包含带通配符的变量名称
myvars
展开变量列表中的字符串以包含完整的变量名称字符串(这应该产生原始变量名称):
local myvars x* hm*
循环遍历变量名称列表,将值设置为缺失:
syntax 'myvars'
但是,我无法弄清楚如何在foreach x of local 'myvars' {
replace 'x' = . if 'x' < 0
}
循环中包含通配符。
上面的代码不起作用并产生for
错误。
我发现Statalist上的以下线程很有用,但它们没有提供解决方案,并且使用存根看起来效率不高:
任何人都可以帮助我吗?
答案 0 :(得分:2)
foreach x of varlist x* h* {
replace `x'= . if `x' < 0
}
从这里开始:
http://www.cpc.unc.edu/research/tools/data_analysis/statatutorial/labor_saving/loops
答案 1 :(得分:1)
@ timat的回答提供了一个很好的基本解决方案,但没有解释你做错了什么。
您似乎在几个层面上感到困惑:
如何引用本地宏
使用左右单引号,不重复(右)单引号:
. local foo = 42
. di `foo'
42
如何最好地解压缩通配符变量列表
syntax
会执行此操作,但由于foreach
将直接执行此操作,syntax
对您的问题来说是多余的。但即使这样,你的syntax
例子在几个方面也是错误的。由于它的使用是不必要的,我不会对此进行扩展。
宏名称及其内容之间的区别
foreach x of local `myvars' {
(注意纠正的标点符号)几乎不是你需要的。它通常是
foreach x of local myvars {
专栏思考
Stata不是电子表格程序。列可以是您的私有词,并且不会造成任何损害,但不直接支持列索引。
如何查找答案
你是(我猜)谷歌搜索答案,而不是试图阅读Stata文档。后者有很多,初学者很难知道在哪里看,但foreach
及相关解释的基本帮助比你引用的帖子更有效。他们都很好(反过来我写了两个......)但是距离你的问题还有一段距离,而且你在任何一个问题上找不到问题的答案也就不足为奇了。如果你想掌握基本的Stata,至少在用户指南的前半部分没有真正的替代品。