在Stata中使用循环导出数据文件

时间:2017-09-04 02:05:56

标签: loops foreach stata

我有一个包含20个城市的大型数据集,我希望将每个城市拆分为较小的城市。数据集中的每个变量都将导出到文本文件中。

foreach i in Denver Blacksburg {
use "D:\Data\All\AggregatedCount.dta", clear

drop if MetroArea != `i'

export delimited lnbike using "D:\Data/`"`i'"'/DV/lnbike.txt", delimiter(tab) replace
export delimited lnped using "D:\Data/`"`i'"'/DV/lnped.txt", delimiter(tab) replace 
}

我试过i' and"`我'"'在导出命令中,但没有一个工作。错误是

  

"没有找到丹佛。"

我也有中间空间的城市,比如洛杉矶。我试过了

local city `" "Blacksburg" "Los Angeles" "Denver" "'
foreach i of city {
use "D:\Data\All\AggregatedCount.dta", clear

drop if MetroArea != `i'

export delimited lnbike using "D:/Data/`"`i'"'/DV/lnbike.txt", delimiter(tab) replace
export delimited lnped using "D:/Data/`"`i'"'/DV/lnped.txt", delimiter(tab) replace 
}

这也没有用。你有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您想继续使用Stata,您在第一个代码段中唯一需要更改的内容是

\`i'

\

请注意export delimited lnbike using "D:\Data\\`i'/DV/lnbike.txt", delimiter(tab) replace ,以便您的代码如下所示:

/

(我会亲自将所有正斜杠(\)更改为反斜杠(i),但是额外的一个是因为字符串中左单引号前的反斜杠仅评估左侧单引号。使用第二个反斜杠告诉Stata您希望对本地宏foreach i of city { 进行评估。

如果您还更改了

,您的第二个代码段也可以正常工作
foreach i of `city' {

date

阅读本地宏可能会有所帮助:它们肯定会让人感到困惑,但如果您知道如何使用它们则功能强大。

答案 1 :(得分:0)

这个答案与@Eric HB的有用答案重叠。

考虑到20个(或更多)城市,您不应该键入这些城市名称,这是繁琐且容易出错的,而且不需要。您也不需要一次又一次地读入数据集,因为您只需要export您想要的部分。这应该让你更接近。

use "D:/Data/All/AggregatedCount.dta", clear

* result is integers 1 up, with names as value labels
egen which = group(MetroArea), label 
* how many cities: r(max), the maximum, is the number  
su which, meanonly 

forval i = 1/`r(max)' { 
     * look up city name for informative filename  
     local where : label (which) `i' 
     export delimited lnbike if which == `i' using "D:/Data/`where'/DV/lnbike.txt", delimiter(tab) replace
     export delimited lnped if which == `i' using "D:/Data/`where'/DV/lnped.txt", delimiter(tab) replace 
}

有关原则尚未讨论:

- 测试文字字符串时,需要" "或复合双引号来分隔这些字符串。否则Stata认为你的意思是变量或标量名称。这是你的第一个错误,如给出的

drop if MetroArea != `i' 

解释为

drop if MetroArea != Denver 

Stata无法找到变量Denver。如您所见,您需要

drop if MetroArea != "`i'" 

- Windows使用反斜杠作为文件和目录名称中的分隔符,但Stata也使用反斜杠作为转义字符。如果在此类文件分隔符后使用本地宏名称,则结果可能非常错误。这在[{3}}中的[U] 18.3.11以及this manual chapter中记录。正斜杠永远不会成为问题,Stata会按照您的意图理解它们,即使使用Windows也是如此。

所有这一切都说,很难相信你会因为大量的小文件而变得更好,但这取决于你想用它们做什么。