tidyverse

2022-10-25 19:49:14 浏览数 (3)

背景

Tidyverse 是 Rstudio 公司推出的专门使用 R 进行数据分析的一整套工具集合,里面包括了readr,tidyr, dplyr,purrr,tibble,stringr, forcats,ggplot2 等包。https://github.com/tidyverse/

Tidyverse 包含模块

这些包涵盖了数据读取,清洗,转换,字符串处理,建模,数据可视化,生成报告等完整过程。可以阅读《R 数据科学》查看完整教程。

《R 数据科学》电子书:https://r4ds.had.co.nz/

tidyverse 包重构了 R 语言处理数据的语法,比默认的 R 函数更加方便,相当于一套新的语法,使用起来更加方便。但是并不是所有的 R 包都兼容这套语法。

tidyr 与 dplyr 包是用 R 语言中用来处理各种数据整合分析的包,可以说是 R 数据整合的“瑞士军刀”,tidyr 包负责将数据重新整合,dplyr 包可以完成数据的排序,筛选,分类计算等都等操作,还包括各种集合的运算。掌握这两个包就可以完成绝大部分的数据处理工作。

官网:https://www.tidyverse.org/

一、tidyr 数据整理

tidyr 包用于将数据重新整合,替代之前的 reshape 和 reshape2 包,用于数据的重塑与聚合,类似于 Excel 中的数据透视功能 pivot。tidyr 之前的版本主要包含以下几个重要函数:

gather:宽数据变成长数据;

spread:长数据变成宽数据;

unite:将多列按指定分隔符合并为一列

目前最新的版本中主要提供 pivot_longer,pivot_wider 等函数。

1.1 整洁数据

tidyr 名字来自于 tidy(整洁)一词。所谓“整洁数据”,根据 Hadley Wickham 对整洁数据的专门研究,其定义如下:

1. 每个变量构成一列;

2. 每项观察构成一行;

3. 每种类型的观察单元构成一个表格;

tidy data 定义:https://cran.r-project.org/web/p ... ttes/tidy-data.html

总而言之,让数据变地更好用(符合下层函数参数的格式要求),方便用户查找和阅读。简而言之:易阅读,方便用。数据的整理是一个从数据框的统计结构(变量与观察值)到形式结构(列与行)的映射。

tidyr 包主要就是用来将数据转换为“整洁数据”的包,主要功能为

1)缺失值的简单补齐

2)长形表变宽形表与宽形表变长形表;

1.2 长数据与宽数据

长数据

宽数据

1.3 稀疏矩阵与稠密矩阵

在矩阵中,若数值为 0的元素数目远远多于非0元素的数目,并且非 0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非 0 元素数目占大多数时,则称该矩阵为稠密矩阵。

稀疏矩阵( sparse matrix)

代码语言:javascript复制
OTU ID sampleA sampleB sampleC
OTU0 0 0 4
OTU1 6 0 0
OTU2 1 0 7
OTU3 0 0 3

稠密矩阵( dense matrix )

代码语言:javascript复制
sampleA OTU1 6
SampleA OTU2 1
SampleC OTU0 4
SamppleC OTU2 7
SampleC OTU3 3

1.4 数据“融化”与“重铸”

数据“融化”melt 与“重铸”cast 来自于 reshape 包中的概念。这些概念非常形象地描述了数据转换的过程。melt 将数据转换为长数据,cast 重新调整变量。tidyr 数据转换也是类似的方法。

二、tidyr 使用案例

代码语言:javascript复制
library(tidyverse)
library(tidyr)
tdata <- mtcars[1:10,1:3]
tdata
gather(tdata)
tdata <- data.frame(name=rownames(tdata),tdata)
gather(tdata,key = "Key",value = "Value",cyl:disp)
gather(tdata,key = "Key",value = "Value",mpg,cyl,-disp)
gather(tdata,key = "Key",value = "Value",cyl,disp,mpg)

df <- data.frame(x = c(NA, "a.b", "a.d", "b.c"))
df
separate(df,col=x,into = c("A","B"))
df <- data.frame(x = c(NA, "a.b-c", "a-d", "b-c"))
separate(df,x,into = c("A","B"),sep = "-")

#宽数据变长数据
table4a
pivot_longer(table4a, cols = 2:3)
pivot_longer(table4a, cols = 2:3, names_to ="year",values_to = "cases")
tdata
pivot_longer(tdata, cols = 1:2)
pivot_longer(tdata, cols = 1:2, names_to = 'new')
#长数据变宽数据
x <- pivot_longer(table4a, cols = 2:3, names_to ="year",values_to = "cases")
pivot_wider(x, names_from = year,values_from = cases)
table2
pivot_wider(table2, names_from = type,values_from = count)
代码语言:javascript复制
billboard
pivot_longer(billboard,cols = starts_with('wk'),names_to = 'week')
pivot_longer(billboard,cols = starts_with('wk'),names_to = 'week',
             names_prefix = 'wk',values_to = 'rank',values_drop_na = T)

写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。原地址暂未启用(bioinfoer.com)。

代码语言:javascript复制
sx.voiceclouds.cn

有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。

0 人点赞