前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R数据科学整洁之道:使用tidyr进行长宽数据转换

R数据科学整洁之道:使用tidyr进行长宽数据转换

作者头像
简说基因
发布2022-11-11 16:18:02
2.5K0
发布2022-11-11 16:18:02
举报
文章被收录于专栏:简说基因简说基因

整洁的数据都是相似的,凌乱的数据各有各的不同。

整洁数据(tidy data)是指如下图这样的数据表:

在表中:

  • 每个变量都拥有自己的列
  • 每个观察/样本都拥有自己的行

数据这样组织有两个明显的好处:既方便以向量的形式访问每一个变量,也方便变量之间进行向量化运算。

在实际工作中,存在长、宽两种数据格式,宽数据是每个样本的信息在表中只占一行,而长数据每个样本的信息在表中占据多行。

本文简单介绍一下通过tidyr包进行长、宽数据格式转换。

安装

代码语言:javascript
复制
install.packages("tidyr")
# 或者
install.packages("tidyverse")

加载

代码语言:javascript
复制
library(tidyr)
# 或者
library(tidyverse)

宽数据转长数据

让数据变长,就是将许多列融合成两列,将列名移动到一个新的列名下,将值移动到另一个新的列名下。

tidyr提供pivot_longer函数可以将宽数据变长。

代码语言:javascript
复制
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,
  ...
)

创建一个宽表:

代码语言:javascript
复制
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

宽数据转长数据:

代码语言:javascript
复制
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_widerpivot_longer的操作正好相反,可以将长数据转换为宽数据。

代码语言:javascript
复制
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为例,我们将它还原成宽数据格式:

代码语言:javascript
复制
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,将长数据转换为宽数据,就是将两列变成很多列。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简说基因 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 加载
  • 宽数据转长数据
  • 长数据转宽数据
  • 最后总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档