【问题标题】:How to manipulate filenames with a macro如何使用宏操作文件名
【发布时间】:2013-07-12 15:03:34
【问题描述】:

我想将我的 Stata forvalues 循环的结果保存到单独的文件中。文件名的一个组成部分应该是在forvalues 循环中分配给宏的值j

显然我的代码会导致一条指令总是用1995 保存。因此,我收到消息告诉我这个文件已经存在。

我正在使用以下代码:

local j = 1995

forvalues `j'= 1995 / 2012 {  
    clear  
    use "/Users/carl/Desktop/STATA/Neustart/eventdates.dta", clear  
    keep if eventyear == `j'  
    sort acq_cusip eventdate  
    compress  
    save "/Users/carl/Desktop/STATA/Neustart/eventdates_`j'.dta"  
}

有人对此有答案吗?

【问题讨论】:

    标签: loops filenames stata stata-macros


    【解决方案1】:

    在您的原始代码中,Stata 在forvalues 命令中看到`j'(而不是正确的j),因此它在开始循环之前开始评估它。所以最终运行的是

    forvalues 1995=1995/2012 {
    

    这意味着 forvalues 正在混淆地更改本地宏的内容,但在第一次迭代中合法地称为 `1995' 为 1995,在第二次迭代中为 1996 等等。所以当你提到本地 `j'在循环内部,它不会改变并保持在循环之前定义的原始值。

    解决这个问题的方法是替换:

    local j = 1995
    forvalues `j' = 1995/2012 {
    

    与:

    forvalues j = 1995/2012 {
    

    【讨论】:

    • 然后他告诉我“找不到 j”,可能是因为如果我踢出本地,则不存在 j 的定义,因此 stata 不知道它
    • 您应该只删除forvalues 命令中的引号,而将它们留在其他任何地方
    • 你能不能告诉我为什么在循环中 j' expression does refer to the normal variable j and not to a local macro? Because I always thought that ' 只会用于调用宏。
    • 错误信息“j was not found”是指变量 j 未找到而不是本地宏 `j' 未找到。所以问题不是本地宏没有定义,实际上它是由forvalues 定义的,但是您未能通过删除引号来评估本地宏,可能是通过键入keep if eventyear== j , j 不带引号表示变量 j 不是本地宏 `j`。
    • 诀窍是要知道 Stata 会在看到宏并执行命令之前立即评估它们。所以你需要考虑你想让 Stata 看到什么。对于forvalues,您希望它看到新本地宏的名称,因此您使用不带引号的 j,但在循环内您希望 Stata 看到本地宏 j 的内容,因此您使用引号。
    【解决方案2】:

    使用replace

    save "/Users/carl/Desktop/STATA/Neustart/eventdates_`j'.dta",replace
    

    更新

    cd  "C:\Users\Vista\Desktop\Stataproject"
    
    
     forvalues j=1/5 {  
     sysuse auto,clear
          keep if rep78== `j'   
           save "auto_`j'.dta",replace
       }
    

    Stata 中的自动数据示例。详情请见Speaking Stata: How to face lists with fortitude

    【讨论】:

    • 不幸的是,这不起作用。它一直在文件名中使用“1995”。相反,我想为 1995 - 2012 年的每一年获取一个不同名称的文件。我的整体语法有问题吗?
    • 所以它循环运行了 18 次,但我没有保存 18 个不同的文件。
    • 但你说你总是想用 '1995' 保存
    • @Metrics 我也看到了,但我将其解释为非母语人士的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2012-08-19
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多