R数据科学整洁之道:使用tidyr进行长宽数据转换
2023-06-13 09:15:01 时间
整洁的数据都是相似的,凌乱的数据各有各的不同。
整洁数据(tidy data)是指如下图这样的数据表:
在表中:
- 每个变量都拥有自己的列
- 每个观察/样本都拥有自己的行
数据这样组织有两个明显的好处:既方便以向量的形式访问每一个变量,也方便变量之间进行向量化运算。
在实际工作中,存在长、宽两种数据格式,宽数据是每个样本的信息在表中只占一行,而长数据每个样本的信息在表中占据多行。
本文简单介绍一下通过tidyr
包进行长、宽数据格式转换。
安装
install.packages("tidyr")
# 或者
install.packages("tidyverse")
加载
library(tidyr)
# 或者
library(tidyverse)
宽数据转长数据
让数据变长,就是将许多列融合成两列,将列名移动到一个新的列名下,将值移动到另一个新的列名下。
tidyr
提供pivot_longer
函数可以将宽数据变长。
pivot_longer(
data,
cols,
names_to = "name",
names_prefix = NULL,
names_sep = NULL,
names_pattern = NULL,
names_ptypes = NULL,
names_transform = NULL,
names_repair = "check_unique",
values_to = "value",
values_drop_na = FALSE,
values_ptypes = NULL,
values_transform = NULL,
...
)
创建一个宽表:
library(knitr)
tb_wide = tibble(
country = LETTERS[1:3],
`1999` = c('0.7k', '37k', '212k'),
`2000` = c('2k', '80k', '213k')
)
kable(tb_wide)
country | 1999 | 2000 |
---|---|---|
A | 0.7k | 2k |
B | 37k | 80k |
C | 212k | 213k |
宽数据转长数据:
tb_long = pivot_longer(tb_wide, 2:3, names_to = "year", values_to = "cases")
kable(tb_long)
country | year | cases |
---|---|---|
A | 1999 | 0.7k |
A | 2000 | 2k |
B | 1999 | 37k |
B | 2000 | 80k |
C | 1999 | 212k |
C | 2000 | 213k |
长数据转宽数据
让数据变宽,就是展开表中的两列数据成多列,其中一列提供新的列名,另一列提供值。
tidyr
中的pivot_wider
与pivot_longer
的操作正好相反,可以将长数据转换为宽数据。
pivot_wider(
data,
id_cols = NULL,
id_expand = FALSE,
names_from = name,
names_prefix = "",
names_sep = "_",
names_glue = NULL,
names_sort = FALSE,
names_vary = "fastest",
names_expand = FALSE,
names_repair = "check_unique",
values_from = value,
values_fill = NULL,
values_fn = NULL,
unused_fn = NULL,
...
以上一步得到的长数据tb_long
为例,我们将它还原成宽数据格式:
tb_wide_new = pivot_wider(tb_long, names_from = 'year', values_from = 'cases')
kable(tb_wide_new)
country | 1999 | 2000 |
---|---|---|
A | 0.7k | 2k |
B | 37k | 80k |
C | 212k | 213k |
可以看到,转换后的表与最初的宽表完全一致。
最后总结
tidyr
包最重要的两个函数是:
- pivot_longer,将宽数据转换为长数据,就是将很多列变成两列。
- pivot_wider,将长数据转换为宽数据,就是将两列变成很多列。
相关文章
- python程序设计实践题EXP01-求圆面积、温度转换和绘制五角星
- 进制转换问题
- 向量数据库入坑指南:初识 Faiss,如何将数据转换为向量(一)
- scala 隐式转换
- Premiere Pro 2022 for Mac(pr)更新字幕转换包中文版
- PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附代码数据
- R语言如何做马尔可夫转换模型markov switching model|附代码数据
- 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
- QRExfiltrate:一款基于二维码图像的数据转换与提取工具
- JavaScript时间日期格式转换详解编程语言
- 简单易行:Oracle将数据转换为整数(oracle转换成整数)
- 转换数据轻松实现:使用Oracle 11g进行行列转换(oracle11g行转列)
- 实现Linux毫秒时间的转换,让你更快地掌握时间数据,助力程序开发。(linux毫秒时间转换)
- MSSQL到PGSQL的快速转换,体验新的数据库系统(mssql转pgsql)
- 如何将SQL Server数据行转换为列(sqlserver行变列)
- Oracle内置转换函数利用它实现数据转换(oracle内置转换函数)
- 从CSV格式到MySQL的数据转换(csv to mysql)
- 基于DMB转换程序快速将数据导入Oracle(dmb导入oracle)
- 使用MySQL将一行数据转换为多行文本的方法(mysql一行转为多行)
- MySQL一对多数据转换方法解析(mysql 一对多 转换)
- Oracle二进制精确转换图片技术新拓展(oracle二进制转图片)
- Oracle中位图查询数据的快速转换(oracle 位图转换)
- Oracle数据类型转换不可被隐式完成(oracle不能隐式转换)
- Oracle数据转换从一维到二维实现有效存储(oracle 一维转二维)
- Oracle使用Unhex函数转换十六进制数据(oracle unhex)
- SQLSERVER与ACCESS、EXCEL的数据转换
- JS操作字符串转换为数值并取整的代码