r语言dmy()函数转化出现na_【R语言新书】2.1 tidyverse简介与管道

3b1ae6c51c90273b88bd5cc1417ba0e2.png
张敬信:我的R语言新书信息汇总​zhuanlan.zhihu.com
f5be54e7e914aad89f64e10bdb0d03e5.png

2.1.1 tidyverse 包简介

tidyverse 包是 Hadley Wickham 及团队的集大成之作,是专为数据科学而开发的一系列包的合集, 基于整洁数据,提供了一致的底层设计哲学、语法、数据结构

8fa91c9cfe15b97f7fbaff33a535ffa1.png

tidyverse 用 “ 现代 的 " 、 “ 优雅 的" 方式,以 管道式泛函式 编程技术实现了数据科学的整个流程: 数据导入、数据清洗、数据操作、数据可视化、数据建模、可重现与交互报告

198eeecd0b50a236eb049c44bd5d728f.png

在 tidyverse 包的引领下,近年来涌现出一系列具体研究领域的 tidy* 版本的包,比较综合的有 tidymodels (机器学习)、 rstatix (统计)、 tidybayes (贝叶斯模型)、 tidyquant(金融)、 fpp3 (时间序列)、 tidytext (文本挖掘)、 sf (空间数据分析)、 tidybulk (生信)等。

tidyverse 与 data.table

tidyverse 操作数据语法优雅、容易上手,但效率与主打高效的 data.table 包不可同日而语,处理几 G 甚至几十 G 的数据,需要用 data.table.

但 data.table 的语法高度抽象、不容易上手。本书不对 data.table 做过多展开,其简单使用可参阅附录 2 。另一种不错的方案是使用专门的转化包:有不少包尝试底层用 data.table ,上层用 tidyverse 语法包装(转化),如 dtplyr, tidyfst 等。

2.1.2 管道操作

1. 什么是管道操作?

magrittr 包引入了管道操作,能够通过管道将数据从一个函数传给另一个函数,从而用若干函数构成的 管道 依次变换你的数据。

例如,对数据集 mtcars ,先按分类变量 cyl 分组,再对连续变量 mpg 做分组汇总:计算均值。

library(tidyverse)

mtcars %>%
  group_by(cyl) %>%
  summarise(mpg_avg = mean(mpg))

dde72015111ce3c3c8e2ba56d5ee22d8.png

管道运算符 %>% 的意思是:将左边的运算结果,以输入的方式传给右边函数。若干个函数通过管道链接起来,叫做 管道( pipeline ) 。

x %>% f() %>% g()                       # 等同于 g(f(x))

对该管道示例应该这样理解:

依次对数据进行若干操作:先对 x 进行 f 操作 , 接着对结果进行 g操作 。

管道,也支持 R base 函数:

month.abb %>%                          # 内置月份名缩写字符向量
  sample(6) %>%
  tolower() %>%
  str_c(collapse = "|")

97694a5d59ff7ab093bcccd8fef0d45e.png

使用管道的好处是:

  • 避免使用过多的中间变量
  • 程序可读性大大增强

管道操作的过程,读起来就是对原数据集依次进行一系列操作的过程。而非管道操作,读起来与操作的过程是相反的,比如同样实现上例:

str_c(tolower(sample(month.abb, 6)), collapse="|")

2. 常用管道操作

(1)管道默认将数据传给下一个函数的第 1 个参数,且它可以省略

c(1, 3, 4, 5, NA) %>% 
  mean(., na.rm = TRUE)                  # "." 可以省略
c(1, 3, 4, 5, NA) %>% 
  mean(na.rm = TRUE)                     # 建议写法

这种机制使得管道代码看起来就是:从数据开始,依次用函数对数据施加一系列的操作(变换数据),各个函数都直接从非数据参数开始写即可,而不用再额外操心数据的事情,数据会自己沿管道向前 "流动 " 。

正是这种管道操作,使得 tidyverse 能够 优雅 地操作数据。

所以, tidyverse 中的函数都设计为数据作为第 1 个参数,自定义的函数也建议这样做。

(2)数据可以在下一个函数中使用多次

数据经过管道默认传递给函数的第 1 个参数(通常直接省略);若在非第 1 个参数处使用该数据,必须用 “.” 代替(绝对不能省略),这使得管道作用更加强大和灵活。

下面看一些具体实例:

# 数据传递给 plot 第一个参数作为绘图数据 (. 省略 ),
# 同时用于拼接成字符串给 main 参数用于图形标题
c(1, 3, 4, 5) %>% 
  plot(main = str_c(., collapse=","))

# 数据传递给第二个参数 data
mtcars %>% 
  plot(mpg ~ disp, data = .)

# 选择列
iris %>% 
  .$Species                 # 选择 Species 列内容
iris %>% 
  .[1:3]                    # 选择 1-3 列子集

再来看一个更复杂的例子:

mtcars %>%
  split(.$cyl) %>%                        # . 相当于 mtcars
  map(~ lm(mpg ~ wt, data = .x))

split() 是将数据框 mtcars 根据其 cyl 列(包含 3 个水平的分类变量)分组,得到包含 3 个成分的列表;列表接着传递给 map(.x, .f) 的第一个参数(直接省略),

~ lm(mpg ~ wt, data = .x) 是第二参数 .f ,为 purrr 风格公式写法。

整体来看,实现的是分组建模:将数据框根据分类变量分组,再用 map 循环机制依次对每组数据建立线性回归模型。

5bdd00cd071db7a521b744782d7ad4c5.png

主要参考文献

  1. Hadley Wickham,R for Data Science,2017.
  2. Desi Quintans, Jeff Powell. Working in the Tidyverse.http://www.hiercourse.com/

________________________________

版权声明:原创作品,版权所有,禁止用于一切出版。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值