2016-07-06 1900 views
0

我有一个Stata数据集列表:其中一个变量tor不存在,我想添加该变量(如果它不存在)。在Stata文件列表中重命名和创建变量

该数据集包含一个称为Xclass其中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 
} 

但随后在适当的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") 
} 
+0

看看这些答案的[类似问题](http://stackoverflow.com/questions/37845840/parsing-through-all-folders-in-a-目录)的方法来存储和阅读文件名称。 – lmo

+0

本地'myfilelist'没有定义,所以循环什么都不做。应该是'filelist'。 –

回答

1

这不是一个答案,这是将不适合评论意见。

你正在尝试的不是初级Stata。如果你确实不熟悉Stata(不是stata),那么你会发现自动化这个过程非常困难。作为Stata的新用户,我非常同情你 - 这需要吸收很多。甚至更糟糕的是,如果你有可能很快产生一些产出的压力。尽管如此,我想鼓励您退出您的即时任务。

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

所有这些手册在Stata安装中(从版本11开始)都包含在PDF中,并且可以从Stata内访问 - 例如,通过Stata的“帮助”菜单的PDF文档部分。阅读的目的并不在于掌握Stata,以确保我熟悉各种各样重要的基本技巧,以便在需要的时候,我可能会记得他们的存在,如果不是的话完整的语法。

Stata文档确实堪称典范 - 只有很多。我遵循的道路表达了你需要知道的快速入门。

虽这么说,你也许会找到循环的foreach命令有帮助的,filelist命令获得的Stata数据集(不是数据库)的列表,以及一个Stata的数据集内获取的变量名的列表ds命令。更为巧妙的是,capture命令将允许您尝试generate您的tor变量,并且如果它已经存在,将会优雅地失败,从而节省少量的程序逻辑。

+1

其中,'filelist'是用户编写的,应该使用'ssc install filelist'进行安装。 –

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

+0

'gen adjusted = cond(strpos(“'filename'”,“adjusted”),“yes”,“no”)''总是产生'adjusted = no',即使' filename'。 strpos()是一个函数吗?我试过时似乎无法使用它:'if(!strpos(“'filename'”,“adjusted”)=== true){gen adjusted = yes}'',然后再次这没有意义... – DuEllier

+0

这是基于其他语言的幻想语法。请参阅编辑答案以获得答复。 –

+0

修复'if _rc == 0'到'if _rc'。 –