我想从原始数据中写入六个临时数据文件,保留以下变量:
我尝试了以下内容:
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
条件似乎违反了语法规则。
答案 0 :(得分:1)
我认为你的一些困惑是由于误解了if
限定词与if
命令。
if
命令计算表达式:如果该表达式为true,则执行以下操作。 if
命令应该用于评估单个表达式,在本例中是宏的值。
您可以使用if
限定符,例如,当您想要regress y x if x > 2
或replace x = . if x <= 2
时等。有关简短说明,请参阅here。
您的语法也有其他问题。您不能将代码跟在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
,这样就不会向磁盘写入任何内容。你可以使用
forvalues i = 1/6 {
tempfile temp`i'
// other commands
save `temp`i''
}
这将创建六个Stata数据文件temp1
- temp6
,这些文件保存在内存中,直到程序终止。