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

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. 我要成为node_modules大师!(一):包管理器选择,依赖关系分析

    好家伙 1.npm曾经的一些问题 1. 依赖地狱(Dependency Hell) 嵌套依赖结构:早期版本的 npm 采用嵌套的 node_modules 结构,依赖层级极深,容易导致路径过长问题(尤 ...

  2. halcon 入门教程(三) 边缘检测

    原文作者:aircraft 原文链接:halcon 入门教程(三) 边缘检测 有兴趣可以多看其他的halcon教程 halcon 学习教程目录 本篇讲一下边缘检测(边缘提取),因为这个我发现也是比较常 ...

  3. 🎀SpringBoot启动创建系统托盘及功能

    简介 SpringBoot启动时,创建系统托盘,提供打开主程序及退出功能. 实现 启动类添加构造函数 public TjtoolApplication() { initUI(); } private ...

  4. CSS横向滚动

    Flex版本 .super { display: flex; width: 100%; overflow-x: scroll; white-space: nowrap; } .sub { width: ...

  5. 如何使用CSS和JS使网页页面灰掉

    让页面灰掉,通常是通过CSS样式或JavaScript来实现.以下是一些具体的方法: 一.使用CSS样式 应用filter属性 CSS的filter属性可以用来对元素应用图形效果,如灰度.要将整个页面 ...

  6. LM Studio本地使用

    一.概述 LM Studio 是一款桌面应用程序,用于在您的计算机本地开发和实验 LLM. 官方地址:https://lmstudio.ai 官方中文地址:https://lm-studio.cn 主 ...

  7. System.nanoTime() 方法

    System.nanoTime() 方法 JDK1.5之后java中的计时给出了更精确的方法:System.nanoTime(),输出的精度是纳秒级别,这个给一些性能测试提供了更准确的参考. 注:1 ...

  8. Axure RP大数据可视化大屏原型组件源文件

    Axure RP大数据可视化大屏原型模板 大数据BI分析上大屏,在很多大企业和政府单位客户都需要,高新区市场监控等,那使用Axure RP做交互原型是必不可少的,有了大屏原型模板可做出不同风格和行业的 ...

  9. 时间工具类之“LocalDateTime方案转换地域性时差问题->UTC时间转纽约时间”

    一.使用方法 1.获取纽约ZoneId[纽约时区的ZoneId标识为"America/New_York"] -> ZoneId.of("America/New_Yo ...

  10. CentOS 7.6 安装JDK 1.8

    第一步,下载一个rpm包,下载链接如下 https://www.oracle.com/cn/java/technologies/downloads/ 第二步:上传到服务器中 第三步:输入命令进行安装 ...