【问题标题】:Exporting data files using loop in Stata在Stata中使用循环导出数据文件
【发布时间】:2017-09-04 02:05:55
【问题描述】:

我有一个包含 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"`i'"',但它们都不起作用。错误是

“未找到丹佛。”

我也有一些城市之间有空间,比如洛杉矶。我试过了

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 
}

这也不起作用。你有什么建议吗?

【问题讨论】:

  • 感谢@Hack-R。你有什么建议可以在 R 中解决这个问题吗?
  • Eric HB 在下面的回答中帮助了我使用 Stata,我也有兴趣了解 R 中的解决方案。
  • 当然,抱歉,我现在才回到我的笔记本电脑上。那么,您想为因子变量(每个城市)的每个级别保存一个单独的文件,对吗? for(l in levels(iris$Species){data.table::fwrite(iris[iris$Species==l,],paste0(l,".csv"))} 您也可以使用write.csv() 代替fwrite,这样您就不需要库,但fwrite 更快。

标签: loops foreach stata


【解决方案1】:

如果您想继续使用 Stata,您唯一需要更改的第一个代码 sn-p 是

`"`i'"'

\`i'

注意\,以便您的代码如下所示:

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

(无论如何,我个人会亲自将所有正斜杠 (/) 更改为反斜杠 (\),但额外的一个是因为字符串中左单引号之前的反斜杠仅计算为左单引号。第二个反斜杠告诉 Stata 您希望评估本地宏 i

如果你也改变了,你的第二个代码 sn-p 也可以工作

foreach i of city {

foreach i of `city' {

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

【讨论】:

  • 感谢 Eric HB!我也试过drop if MetroArea != "`i'"' ' 并且成功了。很高兴了解双反斜杠!
【解决方案2】:

此答案与@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 也使用反斜杠作为转义字符。如果您在此类文件分隔符后使用本地宏名称,则结果可能非常错误。这记录在 [U] 18.3.11 的 this manual chapterthis note 中。正斜杠从来都不是问题,Stata 可以按照您的意图理解它们,即使在 Windows 中也是如此。

话虽如此,很难相信拥有大量小文件会更好,但这取决于你想用它们做什么。

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多