本篇介绍的函数来自tidyr工具包,它也是tidyverse系列工具包的重要组成部分。

在之前的推文里,小编介绍了一些数据批量化处理的方法,如下(点击文字可直接跳转):

  • base | 使用apply族函数进行向量化运算

  • purrr | 使用map族函数进行向量化运算

  • 技巧 | 如何批量地将整型变量转换为因子变量

  • dplyr | 提高数据处理效率!数据框的colwise和rowwise操作

在这些推文中,为了方便介绍向量化/批量化操作的特点,小编举的都是一些比较简单的例子,而在实际的数据处理中,通过结合数据的嵌套化操作apply()族、map()族等函数可以实现更复杂场景的批量化运算。

数据嵌套化

nest()函数的语法结构如下:

nest(.data, ..., .names_sep = NULL)
  • data:输入对象(数据框结构);

  • ...:嵌套语句。

数据嵌套化和数据分组的区别:

  • 数据分组(dplyr::group_by()函数):建立分组索引,但不会实际改变数据框的大小(行数和列数);

  • 数据嵌套(tidyr::nest()函数):将同一分组对应的其他变量信息嵌套在一个list中,再作为数据框的一个元素,会改变数据框的大小。

以上介绍可能有些抽象,下面通过实例进行介绍它的两种用法。

单独使用

library(tidyverse)
data("iris")nested.iris <- iris %>%nest(petal = c(Petal.Length, Petal.Width), sepal = c(Sepal.Length, Sepal.Width))
  • 通过以上代码,Petal.LengthPetal.Width变量就被嵌套成petal变量了,Sepal.LengthSepal.Width变量则被嵌套成了sepal变量;

  • 未参与嵌套的变量自动作为分组变量。

嵌套前:

嵌套后:

  • 只有Species变量未参与嵌套操作,因此自动被作为分组变量。

通过点击上图中红色框内的按钮,可以查看被嵌套的数据,如下图:

  • 可以看出,被嵌套的数据也是一个完整的数据框结构。

group_by()函数连用

nest()函数还可以跟在group_by()函数之后使用,这种用法更为常用。示例如下:

nested.iris2 <- iris %>%group_by(Species) %>%nest()

输出对象如下:

嵌套后批量化运算

数据嵌套化使得每组数据独占一行,有利于进行批量化操作,这一点在介绍“线性模型之亚组模型”中已有介绍,这里再重复一下示例:

model <- mtcars%>%group_by(cyl) %>%nest() %>%mutate(model = map(data, ~lm(mpg ~ wt + qsec, data = .x)))

去嵌套化

同取消分组操作一样,也存在取消嵌套化操作,相应函数为unnest()

unnest(data, cols, ...,keep_empty = FALSE,ptype = NULL,names_sep = NULL,names_repair = "check_unique")

该函数使用起来也非常简单,默认取消所有嵌套结构。示例如下:

unnested.iris <- unnest(nested.iris)
  • 输出对象与嵌套前的对象一样。

仅取消部分嵌套结构,需指定cols参数。示例如下:

unnested.iris2 <- unnest(nested.iris, cols = c(petal))

unnest()函数相关的还有另外两个函数:unnest_longer()unnest_wider(),这两个函数必须指定col参数(注意参数名是col而不是cols)。

unnest_longer()函数输出对象与unnest()相似,但数据结构存在区别。示例如下:

unnested.iris3 <- unnest_longer(nested.iris, col = petal)

上图虽然看起来和unnest()函数的输出对象一样,但它实际上只有3个变量:

names(unnested.iris3)
## [1] "Species" "petal"   "sepal"

unnest_wider()函数生成的是“宽”数据。示例如下:

unnested.iris4 <- unnest_wider(nested.iris, col = petal)

tidyr | 批量处理数据的前奏——数据嵌套化相关推荐

  1. 6.9 用Python操控数据库(批量删除,百度新闻数据爬取与存储,写入数据时进行去重处理,pandas读取sql数据)

    学习完MySQL数据库的基本操作后,下面来学习如何用Python连接数据库,并进行数据的插入.查找.删除等操作. 6.9.1 用PyMySQL库操控数据库 上一节在phpMyAdmin 中创建了数据库 ...

  2. 批量修改数据映射_Docker 数据卷操作「Docker 系列-6」

    数据卷入门 在前面的案例中,如果我们需要将数据从宿主机拷贝到容器中,一般都是使用 Docker 的拷贝命令,这样性能还是稍微有点差,没有办法能够达到让这种拷贝达到本地磁盘 I/O 性能呢?有! 数据卷 ...

  3. PHP如何批量更新MYSQL中的数据

    最近项目需要用到批量更新数据库里的数据,在网上找了一下这方面的例子,觉得这个还不错,分享给大家. 在这个业务里里面涉及到了更新两张数据表,那么大家是不是会想到非常简单,马上上代码 $sql = &qu ...

  4. mysql导入多个txt_MySQL批量导入Excel、txt数据

    我想Excel是当今最大众化的批量数据管理软件了吧,所以我们会经常涉及到将Excel中数据导入到MySQL中的工作.网上有一些关于直接将Excel导入MySQL的教程,不知道是我安装的office不对 ...

  5. Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

    通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数不多时不打紧.然而自 Oracle 8i 起,Oracle 为我们提供了 fetc ...

  6. kibana数据导入导出_MySQL数据库批量导出和导入查询数据

    MySQL数据库批量导出和导入查询数据的过程是使用-e参数去执行命令. 由于工作需要,我需要先在一个MySQL库中查询出结果,然后以查出结果为参数,去放入另外一个MySQL数据库中当成where的条件 ...

  7. 快速清除oracle多个表,Oracle数据库之批量清除一个表的数据,TB级别数据

    本文主要向大家介绍了Oracle数据库之批量清除一个表的数据,TB级别数据,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 有个需求,要求清理8TB的数据,只保留一个月的数据,现 ...

  8. mysql批量导入txt数据_MySQL批量导入Excel、txt数据

    我想Excel是当今最大众化的批量数据管理软件了吧,所以我们会经常涉及到将Excel中数据导入到MySQL中的工作.网上有一些关于直接将Excel导入MySQL的教程,不知道是我安装的office不对 ...

  9. matlab批量处理excel(CSV)文件数据

    微信公众号:好玩的matlab 今天是2019-1-29,参加完2019年美国大学生数学建模竞赛,小伙伴都回家了,就我一个人在寝室,太无聊了,就把在比赛中遇到的excel批处理,写一下思路(ps:其实 ...

最新文章

  1. 解决SVN 每次操作都需要重输入用户名密码问题
  2. 互联网1分钟 |1227
  3. 数据可视化01--笔记
  4. Go中new和make的区别
  5. PHP页面显示中文字符出现乱码
  6. select * 排除字段_interesting数据库查找语句Select还能这样用
  7. python定义一个空列表lt_4. Python 基础之阶段测试(一)
  8. mappedBy的作用
  9. netperf测试最大连接数
  10. 软件开发中三员管理职责
  11. mysql改列名_mysql怎么修改列名
  12. 美国向谷歌、微软、雅虎要个人敏感信息,他们真给了
  13. awd的批量脚本 pwn_北极星杯 awd复现
  14. 国内最前沿的科技——室内导航技术发展及其现状
  15. 数字地球与计算机技术联系,数字地球与现代测绘科学的发展问题
  16. 一文学会 PC搭建opengl es C++开发环境
  17. 一键seo提交收录_Api提交百度搜索进行文章收录-网站SEO
  18. 微型计算机期末考试复盘(知识点总结)
  19. Ubuntu系统下制作USB启动盘
  20. 黑苹果开机几分钟就死机

热门文章

  1. Java基础学习总结(94)——Java线程再学习
  2. linux修改last权限,Linux常用命令2/3(有关用户、权限管理的命令)--Unix/Linux操作系统04...
  3. chararray遍历_数组遍历的三种方法
  4. WebKit 内核浏览器 initKeyboardEvent 函数原型
  5. 比特币技术公司创始人:ICO是一场被骗子玩弄的网络泡沫
  6. linux--vi的使用
  7. 从趣味游戏到排序算法(2)
  8. Kitura —— 基于 Swift 的 Web 框架
  9. 《抓住听众心理——演讲者要知道的100件事》一2.听众需要上下文
  10. 实验楼第三次实验报告