我有许多名称以前缀indoor
开头的变量。 indoor
之后的内容不是数字(这会使一切变得更简单)。
我想为每个变量制作一个表格。
我的代码如下:
local indoor indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
问题在于indoor
命令中的foreach
解析为indoor*
而不是indoor
问题列表,正如我所希望的那样。出于这个原因,tab
命令后面跟着太多变量(它只能处理两个),这会导致错误。
简单的解决方法是用第一个命令替换:
local indoor <full list of indoor questions>
但这是我想要避免的,那就是必须找到这些变量的所有名称,然后将它们粘贴到代码中。似乎有一个更快的解决方案,但我想不出任何。
答案 0 :(得分:8)
诀窍是在要求Stata循环ds
循环中的值之前,使用unab
或foreach
创建varlist扩展。
以下是每个例子:
******************! BEGIN EXAMPLE
** THIS FIRST SECTION SIMPLY CREATES SOME FAKE DATA & INDOOR VARS **
clear
set obs 10000
local suffix `c(ALPHA)'
token `"`suffix'"'
while "`1'" != "" {
g indoor`1'`2'`3' = 1+int((5-1+1)*runiform())
lab var indoor`1'`2'`3' "Indoor Values for `1'`2'`3'"
mac shift 1
}
g group = rbinomial(1,.5)
lab var group "GROUP TYPE"
** NOW, YOU SHOULD HAVE A BUNCH OF FAKE INDOOR
**VARS WITH ALPHA, NOT NUMERIC SUFFIXES
desc indoor*
**使用ds
创建foreach
循环的变量:
ds indoor*
di "`r(varlist)'"
local indoorvars `r(varlist)'
local n 0
foreach i of local indoorvars {
**让我们通过display
local ++n
di in red "--------------------------------------------"
di in red "Table `n': `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"
** tab
表格
tab `i' group, col freq chi2 exact nolog nokey
}
******************! END EXAMPLE
或者使用unab
代替:
******************! BEGIN EXAMPLE
unab indoorvars: indoor*
di "`indoorvars'"
local n 0
foreach i of local indoorvars {
local ++n
di in red "--------------------------------------------"
di in red "Table `n': `:var l `i'' by `:var l group'"
di in red "--------------------------------------------"
tab `i' group, col freq chi2 nokey //I turned off exact to speed things up
}
******************! END EXAMPLE
如果您想使用棘手的选择规则选择室内变量,例如根据变量标签中的信息或其他特征选择室内变量,ds
的优势就会发挥作用。
答案 1 :(得分:2)
这样可行。它与问题中的代码几乎完全相同。
unab indoor : indoor*
foreach i of local indoor {
tab `i' group, col freq exact chi2
}
答案 2 :(得分:1)
您可以使用
执行此操作foreach i of var `indoor' {
tab `i' group, col freq exact chi2
}
答案 3 :(得分:1)
这个问题分为两部分:
<强> 1。如何将多个变量名称分配给本地宏
正如其他人所说,这里显而易见的选择是使用命令ds
和unab
:
ds indoor*
unab indoor : indoor*
<强> 2。如何自动化共享共同前缀的变量列表
对于这一部分,Stata上下文中最简单,最“有效”的循环语法实际上是@Vadim提出的一种语法(并且被下调):
foreach var of varlist indoor* {
tab `var' group, col freq exact chi2
}
毫无疑问,人们可以混合使用这两种方法,但在这种情况下,它只是不必要且效率低下。
答案 4 :(得分:0)
foreach v of varlist indoo* {
do sth with `v'
}