0

我想从我的原始数据中写入六个临时数据文件,保留以下变量:

  • 温度 1:v1-v18
  • 温度 2:v1-v5 v19-v31
  • 温度 3:v1-v5 v32-v44
  • temp4:v1-v5 v45-v57
  • temp5:v1-v5 v58-v70
  • 温度 6:v1-v5 v71-v84

我尝试了以下方法:

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本地宏的条件似乎违反了语法规则。

4

1 回答 1

1

我认为您的部分困惑是由于误解了if限定词与if命令。

if命令计算一个表达式:如果该表达式为真,则执行后面的内容。该if命令应该用于评估单个表达式,在这种情况下,是宏的值。

您可能会使用if限定符,例如,当您想要regress y x if x > 2replace x = . if x <= 2等时。请参阅此处以获取简短说明。

您的语法也有其他问题。您不能将代码与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这些文件保存在内存中,直到程序终止。

于 2016-06-03T15:20:54.793 回答