当前位置: 首页 > article >正文

r语言tidyverse教程:3数据重塑tidyr

文章目录

    • 宽数据和长数据
    • 长宽数据转换
    • 合并和分割列
    • 函数参数

R语言系列:

  • 编程基础💎循环语句💎向量、矩阵和数组💎列表、数据帧
  • 排序函数💎apply系列函数
  • tidyverse:readr💎tibble💎tidyr

tidyr顾名思义就是让数据更整齐,而让数据变得整齐的方法,就是调整行列,在tidyr中,有下列4各函数用于行列转换

  • gather:宽数据->长数据,聚行成列
  • spread:长数据->宽数据,展列为行
  • unite :多列合并为一列
  • separate:一列分离为多列

宽数据和长数据

为了理解这个包的意义,需要先学习两个概念:宽数据和长数据。

宽数据的特点是,每一列代表一个属性,每一行代表一个个体。例如下面这个表格就是宽数据

姓名年龄性别
张三18
李四19

长数据则会把上面的表头和值做一个一一对应,然后罗列出来,每一行都是一对"变量-值"

变量
姓名张三
姓名李四
年龄18
年龄19
性别
性别

但这样的转换过于粗暴,会导致属于相同个体的不同属性完全分开,无法恢复。所以一种更加安全的转换方式可以为

姓名变量
张三年龄18
李四年龄19
张三性别
李四性别

长宽数据转换

tidyr中的gatherspread用于长数据和宽数据之间的转换,为了测试这两个函数,先创建一个变量

test <- data.frame(姓名=c("张三", "李四", "王五"), 年龄=c(18,19,20), 性别=c("男", "女", "男"), 成绩=c(95,96,97))
test
"
  姓名 年龄 性别 成绩
1 张三   1895
2 李四   1996
3 王五   2097
"

然后用gather函数,对其调整,可以发现gIris变成了长数据,其中-姓名表示不对姓名进行重排

library(tidyr)
gTest <- gather(test, key, value, -姓名)

其结果为

> gTest
  姓名  key value
1 张三 年龄    18
2 李四 年龄    19
3 王五 年龄    20
4 张三 性别    男
5 李四 性别    女
6 王五 性别    男
7 张三 成绩    95
8 李四 成绩    96
9 王五 成绩    97

接下来再用spreadgTest进行分割,果然又恢复了原样。

> sTest <- spread(gTest, key=key, value=value)
> 
> sTest
  姓名 成绩 年龄 性别
1 李四   96   192 王五   97   203 张三   95   18

合并和分割列

unit函数可以将数据框中的多列合并成一列,separate与之相反。

下面在test中新插入一列id

> test$id <- c(1,2,3)
> test
  姓名 年龄 性别 成绩 id
1 张三   1895  1
2 李四   1996  2
3 王五   2097  3

由于id和名字是一一对应的,所以二者可以合并在一起

uTest <- unite(test, 人物, id, 姓名, sep='.')
uTest
"
    人物 年龄 性别 成绩
1 1.张三   1895
2 2.李四   1996
3 3.王五   2097
"

可以看到,id姓名这两列通过.连接,合并在了一起,并且得到了新的列名人物

接下来,通过separate将这列再分开

# 这里有个坑,如果分隔符是英文句号,需要用双斜线转义
sepTest <- separate(uTest, 人物, c('id', '姓名'), sep='\\.')

结果为

> sepTest
  id 姓名 年龄 性别 成绩
1  1 张三   1895
2  2 李四   1996
3  3 王五   2097

函数参数

最后,将这四个函数的声明列出来,来看一看其参数列表

gather(data=,key=,value=,...,na.rm=,convert=,factor_key=)
spread(data = ,key = ,value = ,fill = ,convert = ,drop = )
unite(data = ,col = ,... = ,sep = ,remove = )
separate(data = ,col = ,into = ,sep = ,remove = , convert = ,extra = ,fill = ,...)

其中,gather, spread中的data, key, value,以及unite, separate中的data, col, into, sep等均在前面演示过,其他参数含义如下

  • 由于gatherspread涉及到长数据,而长数据是由键值对构成的,所以二者包含keyvalue的选项。
  • na.rm 为布尔型,为T时将删除缺失值
  • convertT时,进行数据类型转换
  • factor_keyF时,自动转为字符串,否则转为因子
  • spread, separate都涉及到一列转为多列的操作,故而由fill参数,用于替换缺失值
  • removeT时,保留参与组合的列

http://www.kler.cn/news/16721.html

相关文章:

  • Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)
  • MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别
  • 来CSDN两年了,一些小感想
  • 第十八章 协程
  • Vue父组件生命周期和子组件生命周期触发顺序
  • Reactive响应式编程系列:解密reactor-netty如何实现响应式
  • Java 基础入门篇(一)—— Java 概述
  • CF1060E Sergey and Subway
  • 并发编程之Atomic原子操作类
  • 【华为OD机试真题】计算网络信号 (javaC++python)100%通过率 超详细代码注释
  • 【计算机视觉】ViT:代码逐行解读
  • linux入门---软硬链接
  • 支持轴体热插拔的平价机械键盘,全尺寸带灯效,雷柏V700DIY上手
  • linux 设置开机启动不同方式
  • Linux系统中查看日志的命令
  • CentOS软件那么老为什么大家还要用它?
  • 为什么在马云成功前就有那么多影像留下来?
  • SpringBoot调取OpenAi接口实现ChatGpt功能
  • rac部署前配置互信
  • CUDA编程(六):代码分析与调试
  • 死信队列
  • Vue3透传Attributes
  • Crowdsoure的简单介绍
  • Android Signal 使用
  • 关于使用Notion的board做工作安排这件事
  • 『Linux』第九讲:Linux多线程详解(一)_ 线程概念 | 线程控制之线程创建 | 虚拟地址到物理地址的转换
  • 云原生技术概谈
  • 医院安全(不良)事件报告系统 PHP语言实现
  • 【华为/华三】PPP
  • springbean 并发安全