我正在尝试foreach在Stata中编写一个循环,它将自动生成数据集中所有连续变量的日志转换(排除字符串,二进制变量).我试过的代码似乎不起作用如下:
qui foreach v of varlist _all {
gen 'v' = log(v)
}
Run Code Online (Sandbox Code Playgroud)
另外,我想编写一个循环,它将生成所有可能的交互项排列,但我不知道如何处理这个问题.
几个问题:
如果使用_all并具有字符串类型变量,则循环将失败.您不能记录字符串变量的日志.这将导致类型不匹配错误,因此用于ds恢复数字变量列表.
你有gen 'v'它应该是gen `v'.请注意所用报价类型的细微差别.
您不能generate存在已存在的变量.因此,例如,l将新变量名称的前缀附加到:gen l`v'.
你错过了引号log(`v').
尝试更像的东西
clear all
set more off
sysuse auto
ds, has(type numeric)
quietly foreach v of varlist `r(varlist)' {
gen l`v' = log(`v')
}
Run Code Online (Sandbox Code Playgroud)
这不会保护您不要记录指标变量(如foreign示例中)或非正值(这将导致缺失(.)).
如果我们假设带有值labels(help label)的变量是非连续变量,那么您可以进一步过滤变量列表:
<snip>
ds, has(type numeric)
ds `r(varlist)', not(vallabel)
<snip>
Run Code Online (Sandbox Code Playgroud)
此代码将省略指示符变量foreign.
请参阅help return阅读使用存储的结果,如r(varlist).