tidyverse 包是 Hadley Wickham 及团队的集大成之作,集数据读取,操作,探索和可视化于一体的一系列R包的集合。其理念是一开始先忽略编程的一些基础概念,如向量,矩阵,数据框,因子等,而是直接从数据的操作入手,可以有效的在短时间内学会数据的处理和可视化。但需要强调的一点是,如果想深入学习R语言以及其他编程语言,基础乃根本。

1. 基础

tibbles数据框和管道操作是学习tidyverse的基础。tibble是通过对传统的数据框功能的修改,开发的一种简单的数据框,更易于使用。在进行线性操作时,管道操作可以让你的代码看起来更加简洁,加代码的可读性。

tibbles数据框

  1. 通过 tibble()函数或 tribble()来创建新tibble, as_tibble()函数将数据框转换为tibble。
  2. tibble()函数当向量长度为1时,tibble会自动重复。
  3. tibble默认的数字类型为double。
  4. 相较于data.frame,tibble()的劣势在于其不能创建行名,不能改变输入的类型。
tibble(  x = 1:4,  y = 1,  z = letters[1:4])

tribble(  ~x, ~y, ~z,  1,  1,  "a",  2,  1,  "b",  3,  1,  "c",  4,  1,  "d")

tibble中也可以使用R中无效的变量名称,但需要加反引号。

tibble(  `100` = 1:4,  `<:` = 1,  `:)` = letters[1:4])

在处理大数据集时,tibble在打印时,只显示前10行的结果;并且,借鉴于 str()函数,打印出每列的数据类型。

nycflights13::flights

2. 管道操作

管道操作%>%来源于Stefan Milton Bache开发的magrittr包,其原理是进行“词法变换”。在进行线性操作时,基于管道操作,可以优化代码,免去建议中间变量的繁琐步骤,增加代码的简洁性和可读性。并且管道操作也可用于基础函数,但是assign(),trycatch()等函数不适合于管道操作。

建议在操作步骤大于10,操作步骤复杂或有多个输入和输出的情况下最好不要使用管道。

# 对mtcars数据集每列求均值,函数不理解没关系,后续会讲到mtcars %>%   as_tibble() %>%   summarise_all(mean)

更多的管道操作符可以使用help(package = "magrittr")查看。

2. 数据读写

数据读入

主要通过readr包的函数来实现。相较于基础函数,readr包函数的读取速度要快10倍左右,并且由于其不会集成操作系统的功能,因而更易重复使用。

  • read_csv()读取逗号分隔的文件;
  • read_csv2()读取分号分隔的文件;
  • read_tsv()读取制表符分隔的文件;
  • read_delim()读取任意字符分隔的文件;
  • read_fwf()读取固定宽度的文件;
  • read_table()读取空白字符分隔的文件;
  • ......

此外,常见的excel文件可以使用readxl包的 read_excel, read_xls(), read_xlsx()函数读取;SPSS、Stata 和 SAS ⽂件可以通过haven包读取;JSON串通过jsonlite包读取;XML通过xml2包读取。

以read_csv()函数为例,其主要参数如下:


这里我提前将iris数据集保存到本地,再使用read_csv来读取。

data <- read_csv("iris.csv")

数据写出

readr包提供的write_系列函数用于数据的写出,其中, write_csvwrite_tsv()最常见,因为他们使用UTF-8对字符串编码,使用ISO8601格式保存时间数据,所以他们生成的文件能顺利读取的概率更高。此外,wrtie_excel_csv()可以生成excel文件。

3. 基于dplyr的数据转换

基于nycflights13::flights和mtcars数据集,介绍dplyr包中的基础操作。具体可使用?flights和?mtcars查看。

数据筛选

filter()函数中的多个参数之间是通过“与”组合起来的。

筛选出12月31日的航班信息

nycflights13::flights %>%   filter(month == 12, day == 31)

此外,filter_系列函数还包括filter_all(),filter_at(), filter_if()函数。

  1. filter_all 该函数对数据框中的每一行都进行筛选操作。
# 筛选任一列中大于150的行# 辅助函数还有all_varsmtcars %>%   filter_all(any_vars(. > 150))

  1. filter_at
# 筛选所有d开头的列变量都能够被2整除的行mtcars %>%   filter_at(vars(starts_with("d")), any_vars((. %% 2) == 0))

  1. filter_if
# 首先将所有列的值转换不大于某个值的最大整数值,然后使用all函数判断转换前后值是否相同而产生逻辑值,当值为TRUE时,筛选出所有列均不等于0的观测值mtcars %>%   filter_if(~ all(floor(.) == .), all_vars(. != 0))

数据选择

select()函数基于变量名操作,可以快速生成一个有用的变量子集。

nycflights13::flights %>%   select(year, month, dep_time)

nycflights13::flights %>%   select(year:dep_time)

select也可以使用“-”选择不在某个范围内,或者非某个变量名的列。

nycflights13::flights %>%   select(-(year:dep_time))

在 select() 函数中还可以使⽤⼀些辅助函数:

  • starts_with("abc") :匹配以 abc 开头的名称。
  • ends_with("xyz") :匹配以 xyz 结尾的名称。
  • contains("ijk") :匹配包含 ijk 的名称。
  • matches("(.)\1") :选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有重复字符的变量。
  • num_range("x", 1:3) :匹配 x1、x2 和 x3。

以ends_with为例:

nycflights13::flights %>%   select(ends_with("time"))

此外,与filter函数类似,select系列还有select_at(), select_if(),select_all()等,具体可以通过help()查看,用法与filter类似。

数据排列

arrange()函数基于选择的列,对数据框的行进行排序。如果参数不止一个,则在前一个参数排序的基础上再进行排序。默认是升序,使用desc()函数可以进行降序排列,缺失值总排在最后。

nycflights13::flights %>%   arrange(desc(month), dep_time)

那么,一次性想选择多列进行排序,该如何实现呢?across()函数为我们提供了解决办法,其能够同时对多列应用函数。

nycflights13::flights %>%   arrange(across(year:month))

同样,arrange也存在三种变体,同样是at, all, if系列,具体使用参见函数帮助文档。

添加新变量

mutate()函数,其也有at,all,if变体系列。此外,还有mutate_each()mutate_each_()函数,但是,在dplyr 0.7.0.中,mutate_each_()被弃用,作者建议使用across()函数代替。

nycflights13::flights %>%   .[, 4:8] %>%   mutate(time = dep_time - arr_time)

mtcars %>%   .[1:4, 1:4] %>%   mutate_each(mean)

分组、统计

group_by() 可以将分析单位从整个数据集更改为单个分组。接下来,在分组后的数据框上使⽤ dplyr 函数时,它们会⾃动地应⽤到每个分组,取消分组使用 ungroup()函数。常用的是分组后使用summmarise()函数。

flights %>%  group_by(dest) %>%  summarise(    count = n(),    dist = mean(distance, na.rm = TRUE),    delay = mean(arr_delay, na.rm = TRUE)  ) %>%  filter(count > 20, dest != "HNL")

值得注意的是,当使⽤多个变量进⾏分组时,每次的摘要统计会⽤掉⼀个分组变量。这样就可以轻松地对数据集进⾏循序渐进的分析。 group_by()和summarise()函数也有一系列变体,建议通过阅读帮助文档学习,感觉大同小异(个人观点)。

重命名列

rename() 通过赋值的形式来改变列名; rename_with()函数通过传递函数实现改变列名.当然,它也也诸多变体函数,在这里不一一介绍。

mtcars %>%   .[1:4, 1:4] %>%   rename(Mpg = mpg)

mtcars %>%   .[1:4, 1:4] %>%   rename_with(str_to_title)

长宽数据转换

  1. 宽数据格式变长数据格式

⼀种常⻅的问题是数据集中某些列名不是变量名,而是变量值。为了整理这样的数据集,我们需要将有问题的列旋转到⼀对新的变量中。


tidyr::table4a %>%  pivot_longer(    c(`1999`, `2000`),    names_to = "year",    values_to = "cases")

  1. 长数据格式变宽数据格式 为了方便,我们将上一部分得到的数据重新转成宽数据格式。
tidyr::table4a %>%  pivot_longer(    c(`1999`, `2000`),    names_to = "year",    values_to = "cases") %>%  pivot_wider(    names_from = year,     values_from = cases)

列的拆分、合并

separate()函数能够依据分隔符分隔列,unite()是其反向操作函数。


tidyr::table3 %>%  separate(    rate,    into = c("cases", "population"),    sep = '/')

library(lubridate)nycflights13::flights %>%   .[, 1:3] %>%   unite("ymd", year, month, day, remove = F) %>%   mutate(ymd = as_date(ymd))

欢迎关注我的微信公众号。

参考

  1. 《R数据科学》

R tidyverse学习01相关推荐

  1. R语言学习笔记(1~3)

    R语言学习笔记(1~3) 一.R语言介绍 x <- rnorm(5) 创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差. 1.1 注释 由符号#开头. #函数c()以向量的形式输 ...

  2. R语言学习手记 (1)

    R语言学习手记 (1) 经管的会计和财管都会学数据统计与分析R语言这门课,加上我也有点兴趣,就提前选了这门课,以下的笔记由老师上课的PPT.<R语言编程艺术>和<R语言数据科学> ...

  3. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

  4. 《机器人学导论》学习-01空间描述与变换

    <机器人学导论>学习-01空间描述与变换 一.描述:位置.姿态与坐标系 1.位置描述 2.姿态描述 3.坐标系的描述 二.映射:坐标系到坐标系的变换 1.关于平移坐标系的映射 2.关于旋转 ...

  5. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  6. vue快速学习01、环境与常用属性标签

    vue快速学习01.环境与常用属性标签 1.MVVC MVVM 设计模式是由 Model (模型). View (视图)和 ViewModel (视图模型)三部分组成,是 MVC 设计模式的进化版,即 ...

  7. 2021年R语言学习路线以及资源推荐

    R语言学习从入门到熟练掌握资源推荐 最近有些小伙伴在后台问我要一些资源,呃,前段时间一直没看到消息,现在统一整理一下,由于微信不让发这个,我就放在公众号里了,在公众号里回复[R语言学习资源]即可,如果 ...

  8. R语言学习实战——解决边际分布图

    目录 0 R语言概述 1 本次实战简介 2 涉及的工具包 2.1 ggplot2简介 2.2 ggExtra简介 2.3 ggpointdensity简介 3 开始画图 3.1 安装并载入 3.2 导 ...

  9. R语言学习笔记 06 岭回归、lasso回归

    R语言学习笔记 文章目录 R语言学习笔记 比较lm.ridge和glmnet函数 画岭迹图 图6-4 <统计学习导论 基于R语言的应用>P182 图6-6<统计学习导论 基于R语言的 ...

最新文章

  1. SAP BD87将IDoc状态修改为68 ?
  2. java输出流缓冲区内容清除,Java输入输出流与缓冲区的使用
  3. 898. 子数组按位或操作
  4. 使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
  5. 论文浅尝 | MulDE:面向低维知识图嵌入的多教师知识蒸馏
  6. 华为卡槽打不开怎么办_17500元!华为5G折叠手机刷屏,有人焦虑连夜开会…
  7. LintCode-73.前序遍历和中序遍历树构造二叉树
  8. 整站php_小白同学的福利:PHP常见面试题(附答案)
  9. Eclipse离线安装包官方下载地址
  10. vue+html5实现分类、商品分类、类别、菜单的左右层级布局两种不同精美样式
  11. ERP系统-应收应付子系统-付款单
  12. JNI/NDK入门指南之JNI数据类型,描述符详解
  13. 现当代英国童话小说传统对幻想文学创作的启示
  14. k8s中对pod设置限制只设置了limits
  15. Tomcat构建企业级高负载WEB服务器之部署jspgou商城
  16. [学科总结] 《矩阵论》
  17. DC有刷电机驱动硬件电路
  18. 奔跑吧火柴人c语言开发,奔跑吧火柴人手游-奔跑吧火柴人2019最新版下载v4.8.6-Minecraft中文分享站...
  19. 爆火交友一元脱单、盲盒、微信公众号制作【源码】
  20. shell | {}和()

热门文章

  1. 米佳汇分享在中国互联网发展的过程中,那些令网兼者疯狂的时代。
  2. 税分类及配置 tax
  3. CISSP资料:独家笔记
  4. 方差、协方差、四分位差笔记
  5. matlab dae,matlab解DAE遇到的问题
  6. 女生适合学数据分析吗?过来人告诉你
  7. 【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day9
  8. python中answer是什么意思_用Python实现的quot;石头,剪刀,布quot; - The answer to everything - ITeye博客...
  9. Oracle导出报错: unknown command beginning “exp SCOTT/...“ - rest of line ignored.
  10. c语言编程斐波那契前n项,c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)...