R语言之处理大型数据集的策略

文章和代码已经归档至【Github仓库:github.com/timerring/d... 】或者公众号【AIShareLab】回复 R语言 也可获取。

在实际的问题中,数据分析者面对的可能是有几十万条记录、几百个变量的数据集。处理这种大型的数据集需要消耗计算机比较大的内存空间,所以尽可能使用 64 位的操作系统和内存比较大的设备 。否则,数据分析可能要花太长时间甚至无法进行。此外,处理数据的有效策略可以在很大程度上提高分析效率。

1. 清理工作空间

为了在数据分析时获得尽可能大的内存空间,建议在启动任何新的分析项目时,首先清理工作空间。

R 复制代码
# rm(list = ls(all = TRUE))

函数 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 个变量。

R 复制代码
bigdata <- as.data.frame(matrix(rnorm(50000 * 200), ncol = 200))
# 使用了嵌套的两个 for 循环语句和 R 的内置常量 letters(小写英文字母)为 200 个变量命名。
varnames <- NULL
# 外面一层循环语句构建变量名的第一个字符(a~t)
for (i in letters[1:20]) {
# 里面一层循环语句把数字 1~10 用 `_` 作为分隔符分别连接到这些字母上。
  for (j in 1:10) {
  # 函数 paste( ) 用于连接字符串。
    varnames <- c(varnames, paste(i, j, sep = "_"))
  }
}
names(bigdata) <- varnames
names(bigdata)

如果你不太想使用多个循环,可以考虑

R 复制代码
# 可惜 apply 此处会导致多余的空格
# apply(expand.grid(1:20, letters[1:20]), 1, function(x) paste(x[2], x[1], sep="_")) 
# sprintf("%s_%s", expand.grid(1:10,letters[1:20])[,2],expand.grid(1:10,letters[1:20])[,1])

# 或者
# as.vector(t(outer(letters[1:20], 1:10, paste, sep="_")))

4. 剔除不需要的变量

在进行正式的分析之前,我们需要把暂时用不上的变量剔除以减少内存的负担。dplyr 包的 select 系列函数在这里可以派上用场,尤其是将这些函数与 tidyselect 包的 starts_with( )、ends_with( ) 和 contains( ) 等函数联合使用会带来诸多便利。

先加载这两个包:

R 复制代码
library(dplyr)
library(tidyselect)

接下来举例说明如何使用 select 系列函数选择或剔除变量。

R 复制代码
subdata1 <- select(bigdata, starts_with("a"))
names(subdata1)
# 'a_1''a_2''a_3''a_4''a_5''a_6''a_7''a_8''a_9''a_10'
subdata2 <- select(bigdata, ends_with("2"))
names(subdata2)
#'a_2''b_2''c_2''d_2''e_2''f_2''g_2''h_2''i_2''j_2''k_2''l_2''m_2''n_2''o_2''p_2''q_2''r_2''s_2''t_2'

函数 starts_with( ) ends_with( ) 分别表示变量的前缀和后缀。在上面的命令中,subdata1 选取了数据集里所有以 a 开头的变量,而 subdata2 选取了数据集里所有以 2 结尾的变量。

如果要选取所有以 ab 开头的变量,可以使用下面的命令:

R 复制代码
# subdata3 <- select(bigdata, c(starts_with("a"), starts_with("b")))
subdata3 <- select_at(bigdata, vars(starts_with("a"), starts_with("b"))) # 注意跟 select 语法稍有不同
names(subdata3)

要选择变量名里包含某些字符的所有变量,可以借助函数 contains( ) 实现。例如,要选择包含字符 1 的所有变量,可以输入下面的命令:

R 复制代码
# subdata4 <- select(bigdata, c(contains("1")))
subdata4 <- select_at(bigdata, vars(contains("1")))
names(subdata4)

需要注意的是,所有以 10 结尾的变量也是包含字符 1 的。

如果要剔除某些变量,只需要在函数 starts_with( )、ends_with( ) 和 contains( ) 前面加上 - 号。例如,要剔除以 15 结尾的变量,可以使用下面的命令:

R 复制代码
# subdata5 <- select(bigdata, c(-contains("1"), -contains("5")))
subdata5 <- select_at(bigdata, vars(-contains("1"), -contains("5")))
names(subdata5)

5. 选取数据集的一个随机样本

对大型数据集的全部记录进行处理往往会降低分析的效率。在编写代码时,可以只抽取一部分记录对程序进行测试,以便优化代码并消除 bug。

R 复制代码
# 参数 size 用于指定行的个数
sampledata1 <- sample_n(subdata5, size = 500)
nrow(sampledata1)
# 参数 size 用于指定占所有行的比例。
sampledata2 <- sample_frac(subdata5, size = 0.02)
nrow(sampledata2)
# 500
# 1000

函数 sample_n( ) 和 sample_frac( ) 都用于从数据框中随机选取指定数量的行,前者中的参数 size 用于指定行的个数,而后者中的参数 size 用于指定占所有行的比例。

需要说明的是,上面讨论的处理大型数据集的策略只适用于处理 GB 级的数据集。不论用哪种工具,处理 TB 和 PB 级的数据集都是一种挑战。R 中有几个包可以用于处理 TB 级数据集,例如 RHIPE、RHadoop 和 RevoScaleR 等。这些包的学习曲线相对陡峭,需要对高性能计算有一定的了解,有需求的话你可以自行探索,这里不做介绍。

sample_n() 和 sample_frac() 即将退休,包文档中推荐改用 slice_sample( ),用法可查看此处

R 复制代码
# 使用 slice_sample( ) 进行处理
sampledata1 <- slice_sample(subdata5, n = 500)
nrow(sampledata1)
sampledata2 <- slice_sample(subdata5, prop = 0.02)
nrow(sampledata2)
相关推荐
羊小猪~~1 小时前
机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
人工智能·python·机器学习·数据挖掘·数据分析·回归·时序数据库
凭栏落花侧6 小时前
决策树:简单易懂的预测模型
人工智能·算法·决策树·机器学习·信息可视化·数据挖掘·数据分析
bin91538 小时前
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化
大神薯条老师14 小时前
Python从入门到高手4.3节-掌握跳转控制语句
后端·爬虫·python·深度学习·机器学习·数据分析
LHNC18 小时前
2024.9.29 问卷数据分析
数据分析
知识分享小能手18 小时前
mysql学习教程,从入门到精通,SQL 修改表(ALTER TABLE 语句)(29)
大数据·开发语言·数据库·sql·学习·mysql·数据分析
bin91531 天前
【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别
大数据·前端·数据库·信息可视化·数据分析·excel·数据可视化
PhyliciaFelicia1 天前
基于R语言机器学习遥感数据处理与模型空间预测
开发语言·深度学习·随机森林·机器学习·数据分析·r语言
bin91532 天前
【EXCEL数据处理】000014 案例 EXCEL分类汇总、定位和创建组。附多个操作案例。
信息可视化·数据挖掘·数据分析·excel·数据可视化·数据图表·excel 数据分析