为什么R对象比Stata/SPSS中的相同数据大得多?

bld*_*bba 13 memory r survey

我有调查数据SPSS,Stata~730 MB大小.~800MB如果我正在处理这些数据,那么这些程序中的每一个程序也会占用大约你期望的空间量().

我一直在尝试拿起R,所以试图加载这些数据R.无论我尝试什么方法(read.dtastata文件,freadcsv文件,read.spssspss文件),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)

几乎瞬间完成,给我相同的结果.

为什么内存使用(按对象和函数)以及时间RStata?之间存在如此巨大的差异?有什么我可以做的来优化数据以及如何R使用它?

ETA:我的机器正在运行64位Windows 8.1,我正在运行R而没有加载其他程序.至少,R的环境与Stata的环境没有区别.

经过一番挖掘,我预计其原因是R的数据类型有限.我的所有数据都存储为int,每个元素需要4个字节.在调查数据中,每个响应都是分类编码的,通常只需要一个字节来存储,stata存储使用'byte'数据类型,R存储使用'int'数据类型,导致大型调查中的一些显着低效.

jmk*_*jmk 0

对我来说,有趣的可能是最终文件比(但是我的工作规模比你小)memisc小得多的包read.spss

来自memisc小插图

...因此,该包提供了加载此类变量子集的工具,而无需加载完整的数据集。此外,从 SPSS 文件加载数据的组织方式是保留有关变量标签、值标签和用户定义的缺失值的所有信息。这是通过导入器对象的定义实现的,导入器对象存在子集方法。导入器对象仅包含有关外部数据集中变量的信息,但不包含数据。当使用函数subset或as.data.set时,数据本身被加载到内存中。