【问题标题】:Reading in only part of a Stata .DTA file in R在 R 中仅读取 Stata .DTA 文件的一部分
【发布时间】:2011-08-03 01:18:33
【问题描述】:

如果这有一个简单的答案,我提前道歉。这似乎是那种东西,但我似乎无法通过搜索 SO 或谷歌搜索在帮助文件中找到它。

我现在正在处理一些数 GB 的数据集。它足以容纳我有权访问的一个集群节点上的内存,但需要相当长的时间来加载。对于使用这些数据进行的许多调试/编程活动,我不需要加载整个文件,只需前几千个观察结果就有一个数据集来测试代码。我当然可以只读取整个文件和子集,但我想知道是否有办法告诉read.dta() 只读取前 N 行?这当然会快得多。

我也可以使用 .csv 之类的正确格式,然后使用 read.csv() 的 nrows 参数,但是我会丢失 Stata 数据集中的因子标签(并且必须从某人那里重新创建相当多 GB 的数据else 的代码输入到这个项目中。因此,首选 .dta 文件的直接解决方案。

【问题讨论】:

  • 将您的 stata-using-colleague 指向 outsheet 导出到 CSV 函数的方向可能是值得的。这个项目可能有点晚了,但下次你们一起工作时可能会更容易。 ats.ucla.edu/stat/stata/faq/outsheet.htm

标签: r stata processing-efficiency


【解决方案1】:

跟进 Joris Meys:对于这种事情,我使用“测试”数据集和“真实”数据集,每个数据集都位于单独的文件夹中。我在 .do 文件的顶部保留一个宏(使用下面的 if/then 语句)来(1)获取数据样本,(2)将输入/输出指向包含一个或另一个的正确文件夹。我可能对每个项目都做不同的事情,但是像这样:

数据创建 .do 文件

blah blah blah 
save                  using data/myfile.dta
save if uniform()<.05 using test_data/myfile.dta   // or bsample, then save for panel data

分析.do文件

local test = "test_"   
// when you're ready to run the file with all the data, use the following 
// local test = ""

use `test'data/myfile.dta
blah blah blah 
outreg2 ... using `test'output/mytable.txt

【讨论】:

    【解决方案2】:

    Stata 的二进制文件是逐行写入的,因此您可以更改 stataread.c 中的 R_LoadStataData 函数以限制读入的行数。但是,这仅在您不需要值标签时才有效因为它们写在文件的末尾,并且需要您阅读整个文件——这不会节省任何时间。

    【讨论】:

      【解决方案3】:

      这将是一个困难的问题,因为底层的do_readStata 函数是编译代码,只能接收整个文件。我相信通常二进制文件很难逐行读取,.dta 是一种二进制格式。此外,R 的原生二进制格式不允许在读入时从数据集中选择多行。

      以我的拙见,您最好从 Stata 中创建一组测试文件(例如,Stata 代码sample 1000, count 将为您提供来自加载数据集的 1000 个观察值的样本),然后使用它们。如果您无权访问 Stata,项目中的其他人应该可以为您执行此操作。

      【讨论】:

      • 无赖,但谢谢。不过,我想这在理论上是可能的,因为您可以在 Stata 中使用 use myfile.dta in 1/1000 之类的东西来做到这一点。我尽量坚持使用 R,但我可能只是对测试集进行统计。
      • @gsk3 :正如 Joshua 解释的那样,如果您侵入了外部包的源代码,则有可能,但是您还需要找到一种方法来读取文件的末尾以获取标签。
      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多