R 语言之处理大型数据集的策略
文章和代码已经归档至【Github 仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R 语言 也可获取。
在实际的问题中,数据分析者面对的可能是有几十万条记录、几百个变量的数据集。处理这种大型的数据集需要消耗计算机比较大的内存空间,所以尽可能使用 64 位的操作系统和内存比较大的设备。否则,数据分析可能要花太长时间甚至无法进行。此外,处理数据的有效策略可以在很大程度上提高分析效率。
1. 清理工作空间
为了在数据分析时获得尽可能大的内存空间,建议在启动任何新的分析项目时,首先清理工作空间。
函数 ls( )
用于显示当前工作空间中的对象,其中参数 all 默认为 FALSE,这里设为 TRUE 是为清除包括隐藏对象在内的所有对象。
此外,在数据分析的过程中,对于临时对象和不再需要的对象,使用命令 rm(object1,object2, …)
及时将它们清除。
2. 快速读取.csv 文件
.csv 文件占用空间小,可以由 Excel 查看和生成,因此被广泛运用于存储数据。在前面里介绍的函数 read.csv( ) 可以很方便地读取 .csv 文件。但是,对于大型数据集,该函数读取数据的速度太慢,有时甚至会报错。这时,可以使用 readr 包里的 read_csv( ) 函数或者 data.table 包里的 fread( ) 函数读入数据,其中后者的读取速度更快(大约为前者的两倍)。
data.table 包提供了一个数据框的高级版本,大大提高了数据处理的速度。该包尤其适合那些需要在内存中处理大型数据集(比如 1GB~100GB)的用户。不过,这个包的操作方式与 R 中其他包相差较大,需要投入一定的时间学习。
3. 模拟一个大型数据集
为了便于说明,下面模拟一个大型数据集,该数据集包含 50000 条记录、200 个变量。
4. 剔除不需要的变量
在进行正式的分析之前,我们需要把暂时用不上的变量剔除以减少内存的负担。dplyr 包的 select 系列函数在这里可以派上用场,尤其是将这些函数与 tidyselect 包的 starts_with( )、ends_with( ) 和 contains( ) 等函数联合使用会带来诸多便利。
先加载这两个包:
接下来举例说明如何使用 select 系列函数选择或剔除变量。
函数 starts_with( )
和 ends_with( )
分别表示变量的前缀和后缀。在上面的命令中,subdata1 选取了数据集里所有以 a
开头的变量,而 subdata2 选取了数据集里所有以 2
结尾的变量。
如果要选取所有以 a
或 b
开头的变量,可以使用下面的命令:
要选择变量名里包含某些字符的所有变量,可以借助函数 contains( ) 实现。例如,要选择包含字符 1
的所有变量,可以输入下面的命令:
需要注意的是,所有以 10
结尾的变量也是包含字符 1
的。
如果要剔除某些变量,只需要在函数 starts_with( )、ends_with( ) 和 contains( ) 前面加上 -
号。例如,要剔除以 1
或 5
结尾的变量,可以使用下面的命令:
5. 选取数据集的一个随机样本
对大型数据集的全部记录进行处理往往会降低分析的效率。在编写代码时,可以只抽取一部分记录对程序进行测试,以便优化代码并消除 bug。
函数 sample_n( ) 和 sample_frac( ) 都用于从数据框中随机选取指定数量的行,前者中的参数 size 用于指定行的个数,而后者中的参数 size 用于指定占所有行的比例。
需要说明的是,上面讨论的处理大型数据集的策略只适用于处理 GB 级的数据集。不论用哪种工具,处理 TB 和 PB 级的数据集都是一种挑战。R 中有几个包可以用于处理 TB 级数据集,例如 RHIPE、RHadoop 和 RevoScaleR 等。这些包的学习曲线相对陡峭,需要对高性能计算有一定的了解,有需求的话你可以自行探索,这里不做介绍。
sample_n() 和 sample_frac() 即将退休,包文档中推荐改用 slice_sample( ),用法可查看此处。
版权声明: 本文为 InfoQ 作者【timerring】的原创文章。
原文链接:【http://xie.infoq.cn/article/ec86e70791de4c1993dbccc33】。未经作者许可,禁止转载。
评论