【问题标题】:Renaming and creating variables in a list of Stata files在 Stata 文件列表中重命名和创建变量
【发布时间】:2016-07-06 13:45:31
【问题描述】:

我有一个 Stata 数据集列表:其中一些变量 tor 不存在,如果它不存在,我想添加该变量。

数据集包含一个名为 xclass 的变量,其中 x 可以是任何东西(例如 Aclasslclass 等)。我想rename那些变量到dec

我想创建一个变量adjusted,如果文件名包含adjusted,则为"yes",否则为"no"

我猜它看起来像:

Loop through list of datasets and their variables {
        if variable contains pattern class 
                        rename to dec
        if no variable tor, then 
                        gen str tor = total
        if file name contains pattern adjusted
                        gen str adjusted = yes
        else gen str adjusted = no
}

但是用适当的Stata语言。

所以我现在得到了这个,但它不工作,它没有做任何事情......

cd "C:\Users\test"
local filelist: dir "." files "*.dta", respectcase

foreach filename of local myfilelist {


   ds *class
     local found `r(varlist)' 
     local nfound : word count `found' 
     if `nfound' == 1 { 
        rename `found' dec
     } 
     else if `nfound' > 1 { 
        di as err "warning: multiple *class variables in `filename'" 
     } 

     capture confirm var tor 
     if !_rc == 0 { 
        gen tor = "total"
     } 

     gen adjusted = cond(strpos("`filename'", "_adjusted_"), "yes", "no") 
}

【问题讨论】:

  • 查看similar question 的这些答案,了解存储和读取文件名的方法。
  • 本地myfilelist 没有定义,所以循环什么也不做。应该是filelist

标签: database loops variables stata renaming


【解决方案1】:

这不是答案,这是不适合评论的建议。

您正在尝试的不是基本的Stata。如果您确实不熟悉 Stata(不是 stata),您会发现自动化此过程具有挑战性。作为 Stata 的新用户,我很同情你——它需要吸收很多东西。更糟糕的是,如果您可能面临快速产生一些输出的压力。不过,我想鼓励您从当前的任务中退后一步。

当我开始认真使用 Stata 时,我首先阅读了与我的设置相关的Stata 入门手册。然后第 18 章给出了进一步阅读的建议,其中大部分都在 Stata 用户指南中,我也通过自己的方式完成了大部分阅读。有很多示例可以复制并粘贴到 Stata 的 do-file 编辑器中以自己运行,更好的是,尝试更改选项以查看结果如何变化。

所有这些手册都以 PDF 格式包含在 Stata 安装(从版本 11 起)中,并且可以从 Stata 中访问 - 例如,通过 Stata 帮助菜单的 PDF 文档部分。阅读的目的不是为了掌握 Stata,而是为了确保我熟悉各种重要的基本技术,以便当我需要它们的时候,我可能会回忆起它们的存在,如果不是完整的语法。

Stata 文档确实堪称典范 - 有很多。我所遵循的路径显示了您需要知道的快速开始的事情。

话虽如此,您可能会发现foreach 命令有助于循环,filelist 命令用于获取 Stata 数据集(不是数据库)列表,ds 命令用于获取变量名称列表在Stata数据集中。更巧妙的是,capture 命令将允许您尝试 generate 您的 tor 变量,如果它已经存在,它将简单地失败,从而节省少量程序逻辑。

【讨论】:

  • 其中,filelist 是用户编写的,应使用ssc install filelist 安装。
【解决方案2】:

可以画出中间部分:

    // assumes local macro filename contains file name 

    ds *class
    local found `r(varlist)' 
    local nfound : word count `found' 
    if `nfound' == 1 { 
        rename `found' dec 
    } 
    else if `nfound' > 1 { 
        di as err "warning: multiple *class variables in `filename'" 
    } 

    capture confirm var tor 
    if _rc { 
        gen tor = "total"
    } 

    gen adjusted = cond(strpos("`filename'", "adjusted"), "yes", "no") 

关于管理文件列表:filelist (SSC) 非常好;另请参阅fs (SSC) 了解不同的方法。

编辑:这是最后一个细节的概念证明:

. local filename1 "something adjusted somehow"

. local filename2 "frog toad newt dragon"

. di cond(strpos("`filename1'", "adjusted"), "yes", "no")
yes

. di cond(strpos("`filename2'", "adjusted"), "yes", "no")
no

strpos("<string1>", "<string2>") 返回非零结果,即如果第一个包含第二个,则第二个字符串在第一个中的起始位置。非零作为参数在 Stata 中表示为真;零表示错误。

请参阅help strpos(),如果需要,请参阅help cond()

我看不到您的文件名来评论或测试您的代码,但一个可能的问题是本地宏未在与您尝试评估表达式的名称空间相同的名称空间中定义。 (这就是local 的意思。)未定义的宏将被评估为空字符串,结果是您提到的。

【讨论】:

  • gen adjusted = cond(strpos("`filename'", "adjusted"), "yes", "no") 总是生成adjusted = no,即使"adjusted"filename 中。 strpos() 本身是一个函数吗?当我尝试这个时,我似乎无法使用它:if(!strpos("`filename'", "adjusted") === true) {gen adjusted = yes},然后也许这没有意义......
  • 那是基于其他语言的幻想语法。查看已编辑的答案以获取回复。
  • if _rc == 0 固定为if _rc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
相关资源
最近更新 更多