↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓

tidyr包

tidyr包主要涉及的功能和函数有:
1)缺失值的简单补齐
2)长表变宽表与宽表变长表
  gather-把宽度较大的数据转换成一个更长的形式,即宽表变长表
  spread-把长的数据转换成一个更宽的形式,即长表变宽表
3)列分割与列合并
  separate-将一列按分隔符分割为多列
  unite-将多列按指定分隔符合并为一列

tidyr包最主要的功能就是长表和宽表之间的转化,类似于Excel中的数据透视表,因此也有人将长表和宽表之间的转化称为透视和逆透视。其转化过程如下图所示:

这个时候有人可能会问:好好的为什么要做长表和宽表之间的转化呢?试想一下上图中宽表的蓝色部分表头为对应时间段:

而如果我们需要一直使用这个数据集,那么随着时间的推移其表头也会随之变化,这时候我们就需要修改对应的代码,非常的麻烦。而改成对应的长表后我们只需要对长表透视一下即可得到宽表的数据,对应代码不需要变化,是不是方便很多?

安装并导入tidyr包

install.packages("tidyr")
library(tidyr)

缺失值的简单补齐

replace_na()函数

replace_na函数语法可以替换数据中的缺失值。

#创建一个带缺失值的数据集
df <- data.frame(x = c(1,2,7,NA,NA,10,22,NA,15),
y = c('a',NA,'b',NA,'b','a','a','b','a'))
#计算x的均值和y列的众数,并使用这两个值替换缺失值(当然也可以选择最大值,中位数等等填充缺失值,视情况而定)
x_mean <- mean(df$x, na.rm = TRUE)
y_mode <- as.character(df$y[which.max(table(df$y))])
#替换缺失值
df2 <- replace_na(data = df, replace = list(x = x_mean, y = y_mode))

补充部分: 缺失值的识别

处理缺失值的一般步骤为:识别缺失值–缺失数据的原因–删除缺失值或用合理的值代替缺失值。
对缺失值识别时可以使用is.na()、is.nan()、和is.infinite()函数来鉴别数据集中是否存在缺失,但是这些函数返回的是所有向量或数据框中每一个元素是否为缺失值,数据量非常大的话就不太好用。另外一种方法就是使用mice包中的md.pattern()函数来发现数据集中缺失值的模式。但该方法只能识别R中的NA和NaN为缺失值,而不能将-Inf和Inf视为缺失值,处理的办法可以用NA替代这些值。

> library(mice)
> md.pattern(df)
y x
5 1 1 0
2 1 0 1
1 0 1 1
1 0 0 2
2 3 5

函数返回了数据集中缺失值的情况,其中x和y列下的数字表示列中是否存在缺失值,0表示列中存在缺失值,1表示列中不存在缺失值。对应第一列的数字表示对应后面缺失情况的数量,最后一列表示有缺失值的变量个数。最后一行是每个变量缺失值的个数。
那我们上述的结果来说,第一行中x,y列对应的值都是1,表示这是x,y列都没有缺失值的情况,整个数据集中有5行数据都没有缺失值,对应第一列数据为5.同时由于x,y都没有缺失值,所以有缺失值的变量个数为0.之后几行也是一样的,然后到最后一行,y列的2表示对于y这一个变量总共有2个Na值,X总共有3个NA值,最后一列表示整个数据集中总共有5个缺失值。

同时我们也可通过VIM包中的aggr()函数可视化数据缺失情况:

library(VIM)
aggr(df, prop = FALSE, numbers = TRUE)

长宽表的相互转换

gather()函数

gather()函数是将宽数据转换为长数据,函数语法和参数如下:

> gather(data=,key=,value=,...,na.rm=,convert=,factor_key=)
# key:创建一个新的列名,这一列的值是转化前数据的列名
# value:再创建一个新的列名,原数据的所有旧列名的对应值成为新列名的值
# ...:按照实际需要自行指定需要转换的列
# na.rm:逻辑值,是否删除缺失值
# convert:逻辑值,在key列是否进行数据类型转换
# factor_key:逻辑值,若是F,则key自动转换为字符串,反之则是因子(原始lever水平保持不变)

使用实例:

#测试数据我们选用R内置的Iris数据集
head(iris,3)
#将iris中的所有列转化为长表(如果数据类型不一致的话可能会自动删除一些列)
gather(iris,key=var1,value = var2,na.rm = F)
#将iris中的Petal.Length和Petal.Width列转化为长表
gather(iris,key=var1,value = var2,Petal.Length,Petal.Width,na.rm = F)
#将iris中的第一列到第四列转化为长表
gather(iris,key=var1,value = var2,1:4,na.rm = F)

spread()函数

spread()函数将长数据转为宽数据,即将列展开为行,语法如下:

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可对fill赋值替换缺失值
convert:用于转化数据类型

使用实例:

创建一个测试的数据集
df = data.frame(name=c("A","A","B","B"),
group=c("g1","g2","g1","g2"),
V1=c(10,40,20,30),
V2=c(6,3,1,7))
#根据对应的V1,v2列转化为宽表
gather(df, Var1, Val2, V1:V2)

列分割与列合并

unite()函数

unite()函数是将数据框中多列合并为一列,调用公式如下:

> unite(data, col, ..., sep = "_", remove = TRUE, na.rm = FALSE)
#data:使用的数据集
# col:指定组合为新列的名字
# ...:指定数据中哪些列组合在一起,支持tidy selection选择
# sep:组合后新列中数据之间的分隔符
# remove:逻辑值,是否保留参与组合的列
#na.rm:是否删除空白

使用实例:

#将df数据集中的name和group连在一起
unite(df,add_col,name,group)
unite(df,add_col,1:2)
unite(df,add_col,c(name,group))
#将所有以V开头的列合并
unite(df,add_col,starts_with("V"))
#以_为分隔符合并前两列,并以:合并后两列
df %>%
unite(add_col,c(name,group),sep='_') %>%
unite(all_unite,c(add_col,V1,V2),sep=':')

separate()函数

separate()函数的作用正好和unite()函数相反,即将数据框中的某列按照分隔符拆分为多列,其语法如下:

> separate(data,col,into,sep,remove = TRUE,extra = "warn",fill = "warn",...)
# data:使用的数据集
# col:待拆分列
# into:定义拆分后新的列名
# sep:分隔符
# remove:逻辑值,如果为True的话删除拆分后的列
#构建一个测试的数据集
test = data.frame(name=c("Tom_MR","Carter_Tomp","Sandy_Yu","Bob_Smith"),
group=c("g1","g2","g1","g2"),
V1=c(10,40,20,30),
V2=c(6,3,1,7))
#保留原始数据中拆分前的列
separate(test,name,c("frist_name","last_name"),sep="_",remove = FALSE)
#不保留原始数据中拆分前的列
separate(test,name,c("frist_name","last_name"),sep="_")

tidyr包在R语言中也经常和dplyr包一起使用进行数据清洗,dplyr包的使用可以查看:http://smilecoc.vip/2021/08/23/R_dplyr/

参考文章:
https://rpubs.com/bradleyboehmke/data_wrangling
https://zhuanlan.zhihu.com/p/22265154
https://www.cnblogs.com/nxld/p/6060533.html

R语言包学习之tidyr包:数据结构重构的更多相关文章

  1. 从零开始系列-R语言基础学习笔记之二 数据结构(二)

    在上一篇中我们一起学习了R语言的数据结构第一部分:向量.数组和矩阵,这次我们开始学习R语言的数据结构第二部分:数据框.因子和列表. 一.数据框 类似于二维数组,但不同的列可以有不同的数据类型(每一列内 ...

  2. 吴裕雄--天生自然 R语言开发学习:模块\包的安装命令

    install.packages('模块包名称') 或者 install.packages('模块包名称',repos='http://cran.us.r-project.org')

  3. 吴裕雄--天生自然 R语言开发学习:数据集和数据结构

    数据集的概念 数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量.表2-1提供了一个假想的病例数据集. 不同的行业对于数据集的行和列叫法不同.统计学家称它们为观测(observation)和 ...

  4. R语言入门级实例——用igragh包分析社群

    R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ...

  5. R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...

  6. R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...

  7. R语言数据分析利器data.table包—数据框结构处理精讲

    R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...

  8. R语言可视化学习笔记之添加p-value和显著性标记

    R语言可视化学习笔记之添加p-value和显著性标记 http://www.jianshu.com/p/b7274afff14f?from=timeline   上篇文章中提了一下如何通过ggpubr ...

  9. R语言数据分析利器data.table包 —— 数据框结构处理精讲

        R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...

  10. R语言︱文本挖掘——词云wordcloud2包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...

随机推荐

  1. C 冒泡排序和选择排序

    冒泡排序 理论概念: 从第一个数开始,将相邻的两个数比较,第一个数和第二个数比较,比如说是从小到大的排序,要是后面的数比前面的小则交换两个的位置,这样第一轮比较基数后最大的数就到了最后面,接着进行第二 ...

  2. Spring的三级缓存详解

    目录 1.什么是三级缓存 2.三级缓存详解 Bean实例化前 属性赋值/注入前 初始化后 总结 3.怎么解决的循环依赖 4.不用三级缓存不行吗 5.总结 一.什么是三级缓存 就是在Bean生成流程中保 ...

  3. Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提效!

    前言 今天大姚带领大家一起来看看 Visual Studio 2022 v17.13 新版发布都更新了哪些新功能,为我们开发工作带来了哪些便利,是否真的值得我们花费时间把 Visual Studio ...

  4. 浏览器窗口之间切换的方法(Select window指令,优先使用方法2)

    Robot framework 在同一个浏览器中切换不同选项卡,通过title来定位选项卡.Title存在不唯一的情况,选择不同的选项卡有一些困难.下面的教程,通过修改selenium配置文件,来实现 ...

  5. 从零开始:基于CUDA 12.6的YOLOv5模型训练实战(RTX 2050显卡全流程)

    基于cuda12.6训练yolov5模型 前面完成了使用CPU调用yolov5s模型进行识别车辆,现在想训练自己的模型进行目标识别,使用CPU效率太低,尝试使用GPU加速的Pytorch,再重新整理了 ...

  6. Java三大特性 封装、继承、多态

    封装 概念: 封装指的是将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问. 封装实现的步骤: 1.修改属性的可见性来显示属性的访问,一般设为pri ...

  7. packer 学习笔记

    前言 网上有一个老哥用 packer 制作镜像的博客里开篇就提到[1]. Failure is success in progress. -- Albert Einstein 不要害怕失败,在用 pa ...

  8. [随记]-我安装 arch linux 的记录

    一.下载安装包 archlinux-x86_64.iso 下载传送门:Arch Linux BitTorrent Download 是磁链和种子下载,往下拉,找到 HTTP Direct Downlo ...

  9. JavaScript最佳实践:从基础到高级

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. cf 870div2 abcd题解

    A题,先假设一个res从0开始,判断说谎人的个数用ans表示,如果res==ans则假设成立 #include<iostream> using namespace std; typedef ...