[英]Use of local macro
我想从原始数据中写入六个临时数据文件,并保留以下变量:
我尝试了以下方法:
forvalues i =1(1)6 {
preserve
local j = 6 + (`i'-1)*13
local k = `j'+12
keep v1-v18 if `j'==6
keep v1-v5 v`i'-v`k' if `i'>6 & `j'<71
keep v1-v5 v71-v84 if `j'==71
export delimited using temp`i'.csv, delimiter(";") novarnames replace
restore
}
我收到invalid syntax
错误。 问题在于keep
语句。 特别是带有局部宏的if
条件似乎违反了语法规则。
我认为您造成困惑的部分原因是由于误解了if
限定词vs if
命令。
if
命令计算一个表达式:如果该表达式为true,则执行以下内容。 if
命令应用于评估单个表达式,在这种情况下为宏的值。
例如,当您希望regress yx if x > 2
或replace x = . if x <= 2
时使regress yx if x > 2
时,可以使用if
限定符replace x = . if x <= 2
replace x = . if x <= 2
等。请参见此处的简短说明。
您的语法也有其他问题。 您的代码不能与forvalues
循环中的forvalues
括号放在同一行,也不能与forvalues
括号放在同一行。 您还可以使用本地i
进行keep
。 我认为您的意思是在这里使用j
,因为i
只是用来迭代循环,而不是标识变量后缀。
此外,这里的逻辑似乎可行,但似乎不太通用或有效。 我想有一个更好的方法可以做到这一点,但是我现在没有时间去尝试它-也许以后再更新。
无论如何,我认为与您尝试过的最相似的正确语法如下所示。
clear *
set more off
set obs 5
forvalues i = 1/84 {
gen v`i' = runiform()
}
forvalues i =1/6 {
preserve
local j = 6 + (`i'-1)*13
local k = `j'+12
if `j' == 6 {
keep v1-v18
}
else if `j' > 6 & `j' < 71 {
keep v1-v5 v`j'-v`k'
}
else keep v1-v5 v71-v84
ds
di
restore
}
我在这里使用ds
来简单地列出数据中的变量,然后di
确实将空白行显示为分隔符,但是您可以简单地重新插入export
,它应该可以正常工作。
如果您确实想要临时数据文件, tempfile
考虑的另一件事是考虑使用tempfile
这样就不会在磁盘上写入任何内容。 你可能会用
forvalues i = 1/6 {
tempfile temp`i'
// other commands
save `temp`i''
}
这将创建六个Stata数据文件temp1
- temp6
,这些文件将保存在内存中,直到程序终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.