R语言中的管道操作——magrittr包
R语言中的管道操作——magrittr包
一、项目环境
- 开发工具:RStudio
- R:3.5.2
- 相关包:magritter
二、数据准备以及问题阐述
这次要解决的问题是如何使用提取数据框中所有包含缺失值的列。我们知道当我们在处理缺失值时,我们经常会使用平均数、中位数、回归、甚至机器学习等方式来填补数据框中的缺失值。但是在实际的分析过程中,在进行缺失值处理之前,我们往往会花大量的时间来探究缺失值之间的相关性。那么在进行分析之前,首要任务自然就是先将所有包含缺失值的列提取出来。下面我们将会用几种方法来进行这一操作,并说明管道操作的优势。
# 首先我们先导入相关包和数据集
# 导入magrittr包
library(magrittr)
# 导入VIM包中的包含缺失值的数据集“sleep”
data(sleep,package = "VIM")
# 查看数据集的前几行数据
head(sleep)
BodyWgt | BrainWgt | NonD | Dream | Sleep | Span | Gest | Pred | Exp | Danger |
---|---|---|---|---|---|---|---|---|---|
6654.000 | 5712.0 | NA | NA | 3.3 | 38.6 | 645 | 3 | 5 | 3 |
1.000 | 6.6 | 6.3 | 2.0 | 8.3 | 4.5 | 42 | 3 | 1 | 3 |
3.385 | 44.5 | NA | NA | 12.5 | 14.0 | 60 | 1 | 1 | 1 |
0.920 | 5.7 | NA | NA | 16.5 | NA | 25 | 5 | 2 | 3 |
2547.000 | 4603.0 | 2.1 | 1.8 | 3.9 | 69.0 | 624 | 3 | 5 | 4 |
10.550 | 179.5 | 9.1 | 0.7 | 9.8 | 27.0 | 180 | 4 | 4 | 4 |
-
BodyWgt: 体重
-
BrainWgt: 脑重
-
NonD: 不做梦时长
-
Dream: 做梦时长
-
Sleep: 睡眠时长
-
Span: 寿命
-
Gest: 妊娠期
-
Pred: 物种被捕食的程度
-
Exp: 睡眠时暴露的程度
-
Danger: 面临的总危险程度
三、提取包含缺失值的列
1、常规形式
library(dplyr)
# 将原始数据赋值到一个临时变量中
data <- sleep
# 在R语言中,FALSE转换成数值会变成0,TRUE转换成数值会变成1
# 之所以用abs绝对值函数,是为了在将其转换成数值的前提下不破坏数据框的结构
data <- apply(as.data.frame(abs(is.na(data))),2,sum)
# 使用dplyr包的select函数选取所有包含缺失值的列
data <- select(sleep,one_of(names(data[data > 0])))
[注]:这是处理这类数据的一张常规的编写方法,但是会发现中间嵌套了很对层,不方便阅读和修改。同时中间变量data在这个计算的过程中重复出现了多次。
2、函数形式
library(dplyr)
# 整体操作没什么变化,只是以函数的形式包裹起来,便于多次使用
na_col_plot <- function(data){
data <- as.data.frame(abs(is.na(data)))
data <- apply(data,2,sum)
data <- select(sleep,one_of(names(data[data > 0])))
return(data)
}
data <- na_col_plot(sleep)
[注]: 函数形式与通常形式,从整体上来说没有什么他也特别大的变化。但当该操作需要重复用到时,函数形式可以大大的减少代码量。
3、管道操作形式
library(dplyr)
# %>% 管道函数可以将符号左边的数据结果,放入右边函数中,作为输入的参数
data <- sleep %>%
is.na() %>%
abs() %>%
as.data.frame() %>%
apply(2,sum)
data <- select(sleep,one_of(names(data[data > 0])))
[注]: 相比于其他形式,管道操作可以更好的看到整个处理过程的没一步骤
四、结语
本文简单的以提取包含缺失值的列作为例子,来突出管道操作相较于其他形式的一个好处。在编写较短的一段线性操作时,管道操作相对于一般的操作和函数操作而言,可以更直观的展示整个线性操作的处理过程。当时管道操作并不是万能的,当遇到单次较长的一个数据操作时,就需要定义有意义的中间变量来方便调试和理解其意图。同时当遇到需要重复多次使用、非线性操作或是多个输入项等情况,都尽量不要使用管道操作。
很长一段时间没有在csdn中写文章了,事实上后面自己学习过程中的大部分文档都是在语雀中完成的,基本都是自己写自己看。后续文章都会分享到自己的个人博客上,感兴趣的话可以关注一下。个人博客地址