在Stata文件列表中重命名和创建变量

时间:2016-07-06 13:45:31

标签: database loops variables stata renaming

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

数据集包含一个名为 x class的变量,其中 x 可以是任何内容(例如Aclasslclass等。 )。我希望rename将这些变量dec

我想创建一个变量adjusted如果文件名包含"yes"则为adjusted,如果不包含"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 }

我想它看起来像是:

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") 
}

然后用恰当的Stata语言。

所以我现在已经得到了这个,但是它没有用,它没有做任何事情......

{{1}}

2 个答案:

答案 0 :(得分: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变量,如果它已经存在,将会正常失败,从而节省了少量的程序逻辑。

答案 1 :(得分:0)

中间部分可以勾勒出来:

    // 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的含义。)未定义的宏将被评估为空字符串,并提及您的结果。