仅读取R中Stata.DTA文件的一部分

仅读取R中Stata.DTA文件的一部分,r,stata,processing-efficiency,R,Stata,Processing Efficiency,如果这有一个简单的答案,我提前道歉。这似乎是会发生的事情,但我似乎无法通过搜索或谷歌搜索在帮助文件中找到它 我现在正在处理几GB的数据集。在我可以访问的一个集群节点上,它足够容纳内存,但需要花费相当多的时间来加载。对于使用这些数据进行的许多调试/编程活动,我不需要加载整个文件,只需要在最初的几千次观察中加载一个数据集来测试代码。我当然可以在和子集中读取整个文件,但我想知道是否有办法告诉read.dta()只读取前N行?这当然要快得多 我也可以使用适当的格式,比如.csv,然后使用read.csv

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

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


我也可以使用适当的格式,比如.csv,然后使用
read.csv()
的nrows参数,但是这样我就会丢失Stata数据集中的因子标签(并且必须从其他人的代码中重新创建相当多GB的数据,这些代码输入到这个项目中。因此,最好是直接解决.dta文件。

这将是一个困难的问题,因为引擎盖下的
do_readStata
函数是编译代码,只能接收整个文件。我相信在一般情况下,二进制文件les很难逐行读取,而
.dta
是一种二进制格式。此外,R的本机二进制格式不允许在读取时从数据集中选择多行


以我的拙见,您最好从Stata中创建一组测试文件(例如Stata代码
sample 1000,count
将从加载的数据集中提供1000个观察值的样本),并与他们一起工作。如果您没有访问Stata的权限,项目中的其他人应该可以为您这样做。

Stata的二进制文件是逐行写入的,因此您可以更改
stataread.c
中的
R\u loadstadata
函数以限制读取的行数。但是,这仅在您不需要时才起作用他使用值标签,因为它们写在文件的末尾,需要您读取整个文件,这不会节省任何时间。

跟进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
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

也许值得让您的stata使用同事指出导出到CSV的
outsheet
功能的方向。这个项目可能会晚一点,但这可能会让您下次一起工作时变得更容易。很遗憾,但谢谢。不过,我想这在理论上是可能的,因为您可以在stata中用一些东西来完成就像
在1/1000中使用myfile.dta一样
。我尽可能地坚持使用R,但我可能只是去统计测试集。@gsk3:正如Joshua所解释的,如果你侵入外来包的源代码,这是可能的,但是你需要找到一种方法来读取文件的结尾并获得标签。