内容提要
处理大型数据集时,先清理工作区释放内存,用data.table包的fread()读取CSV,速度远快于read.csv()。用dplyr和tidyselect的select系列函数按前缀、后缀或包含字符筛选变量,并随机抽样测试代码。这些策略适用于GB级数据,TB级需用RHadoop等工具。
延伸解读
内存管理:从清理工作区开始
处理大型数据集时,内存是首要瓶颈。文章建议在分析开始前用rm(list = ls(all = TRUE))清空工作区,并在过程中及时用rm()删除临时对象。这能释放尽可能多的内存空间,避免分析因内存不足而变慢或无法进行。同时,使用64位操作系统和较大内存的设备也是必要前提。
读取CSV:fread()与readr的取舍
对于GB级数据,read.csv()可能读取过慢甚至报错。文章推荐使用data.table包的fread()或readr包的read_csv(),其中fread()速度约为后者的两倍。但data.table的操作方式与常规R包差异较大,需要一定学习成本。若追求速度且愿意投入学习,fread()是更优选择。
变量筛选:dplyr与tidyselect的配合
当数据集包含数百个变量时,手动选择或删除变量效率低下。结合dplyr的select系列函数和tidyselect的starts_with()、ends_with()、contains(),可以按前缀、后缀或包含字符快速筛选。在函数前加负号即可删除变量。注意contains("1")也会匹配到以10结尾的变量,需留意误选。
随机抽样与函数更新
处理全部记录会降低效率,文章建议先抽取部分数据测试代码。sample_n()和sample_frac()可分别按行数或比例抽样,但这两个函数即将退役,官方推荐改用slice_sample(),通过n或prop参数实现相同功能。在编写代码时,直接使用新函数可以避免未来兼容性问题。
Q&A
处理大型数据集时,如何快速读取CSV文件?
可以使用readr包的read_csv()函数或data.table包的fread()函数,其中fread()读取速度更快,大约是read_csv()的两倍。
在R中处理大型数据集前,为什么要清理工作区?如何清理?
清理工作区可以释放内存,提高分析效率。使用rm(list = ls(all = TRUE))可以清除所有对象,包括隐藏对象。
如何用dplyr和tidyselect按变量名筛选或删除变量?
使用select()函数配合starts_with()、ends_with()、contains()等辅助函数。例如,select(bigdata, starts_with("a"))选择以a开头的变量;在函数前加负号可删除变量,如select(bigdata, -contains("1"))。
处理大型数据集时,为什么要随机抽样?如何实现?
随机抽样可以只测试部分记录,优化代码并排除错误,提高分析效率。可以使用sample_n()或sample_frac()函数,但推荐使用slice_sample(),例如slice_sample(subdata5, n = 500)抽取500行,或slice_sample(subdata5, prop = 0.02)抽取2%的行。
处理TB级数据集有哪些工具?
R中可以使用RHIPE、RHadoop、RevoScaleR等包来处理TB级数据集,但这些包学习曲线较陡,需要了解高性能计算。
data.table包的fread()函数有什么优势?
fread()读取数据速度非常快,大约比readr包的read_csv()快两倍,适合处理大型数据集(如1GB-100GB)。