我有调查数据SPSS
,Stata
其~730 MB
大小.~800MB
如果我正在处理这些数据,那么这些程序中的每一个程序也会占用大约你期望的空间量().
我一直在尝试拿起R
,所以试图加载这些数据R
.无论我尝试什么方法(read.dta
从stata
文件,fread
从csv
文件,read.spss
从spss
文件),R
对象(使用测量object.size()
)2.6 to 3.1 GB
在大小之间.如果我将对象保存在一个R
文件中,那就小于100 MB
,但加载时它与之前的大小相同.
任何使用调查包分析数据的尝试,特别是如果我尝试和subset
数据,都需要比等效命令更长的时间stata
.
例如'hhpers'
,我的数据中有一个家庭大小变量'hh'
,按变量加权'hhwt'
,子集加权'htype'
R代码:
require(survey)
sv.design <- svydesign(ids = ~0,data = hh, weights = hh$hhwt)
rm(hh)
system.time(svymean(~hhpers,sv.design[which
(sv.design$variables$htype=="rural"),]))
Run Code Online (Sandbox Code Playgroud)
将R使用的内存推高到6 GB并花费很长时间 - 用户系统已经过去
3.70 1.75 144.11
stata中的等效操作
svy: mean hhpers if htype == 1
Run Code Online (Sandbox Code Playgroud)
几乎瞬间完成,给我相同的结果.
为什么内存使用(按对象和函数)以及时间R
和Stata
?之间存在如此巨大的差异?有什么我可以做的来优化数据以及如何R
使用它?
ETA:我的机器正在运行64位Windows 8.1,我正在运行R而没有加载其他程序.至少,R的环境与Stata的环境没有区别.
经过一番挖掘,我预计其原因是R的数据类型有限.我的所有数据都存储为int,每个元素需要4个字节.在调查数据中,每个响应都是分类编码的,通常只需要一个字节来存储,stata存储使用'byte'数据类型,R存储使用'int'数据类型,导致大型调查中的一些显着低效.
对我来说,有趣的可能是最终文件比(但是我的工作规模比你小)memisc
小得多的包read.spss
来自memisc
小插图
...因此,该包提供了加载此类变量子集的工具,而无需加载完整的数据集。此外,从 SPSS 文件加载数据的组织方式是保留有关变量标签、值标签和用户定义的缺失值的所有信息。这是通过导入器对象的定义实现的,导入器对象存在子集方法。导入器对象仅包含有关外部数据集中变量的信息,但不包含数据。当使用函数subset或as.data.set时,数据本身被加载到内存中。