R语言中的管道操作——magrittr包

R语言中的管道操作——magrittr包

一、项目环境

  • 开发工具:RStudio
  • R:3.5.2
  • 相关包:magritter

二、数据准备以及问题阐述

这次要解决的问题是如何使用提取数据框中所有包含缺失值的列。我们知道当我们在处理缺失值时,我们经常会使用平均数、中位数、回归、甚至机器学习等方式来填补数据框中的缺失值。但是在实际的分析过程中,在进行缺失值处理之前,我们往往会花大量的时间来探究缺失值之间的相关性。那么在进行分析之前,首要任务自然就是先将所有包含缺失值的列提取出来。下面我们将会用几种方法来进行这一操作,并说明管道操作的优势。

# 首先我们先导入相关包和数据集
# 导入magrittr包
library(magrittr)

# 导入VIM包中的包含缺失值的数据集“sleep”
data(sleep,package = "VIM")

# 查看数据集的前几行数据
head(sleep)
BodyWgtBrainWgtNonDDreamSleepSpanGestPredExpDanger
6654.0005712.0NANA3.338.6645353
1.0006.66.32.08.34.542313
3.38544.5NANA12.514.060111
0.9205.7NANA16.5NA25523
2547.0004603.02.11.83.969.0624354
10.550179.59.10.79.827.0180444
  • 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中写文章了,事实上后面自己学习过程中的大部分文档都是在语雀中完成的,基本都是自己写自己看。后续文章都会分享到自己的个人博客上,感兴趣的话可以关注一下。个人博客地址