R语言tidy data之Pivot

Posted 五李三张

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言tidy data之Pivot相关的知识,希望对你有一定的参考价值。


每次拿到手里的数据,总是乱的,而且不一定是自己想要的那种格式,用R语言画图时,其前提也必然时数据要整洁规范。今天主要讲两点:①何为整洁的数据?②如何使用Pivot来tidy data。


正文共:2432 字 6 图

预计阅读时间: 7 分钟


何为整洁的数据

R语言tidy data之Pivot

如图1所示,若用R语言可视化,数据的组织形式必须是:列名为变量名,每行中的值都为已知的确定值(缺失值NA也算)。

R语言tidy data之Pivot

图1


比如table1就是不整洁的,1999和2000是确定的已知值,不能作为列名,列明应该为变量名year;而table2就是整洁的。

table1  # cases
#> # A tibble: 3 x 3
#> country `1999` `2000`
#> * <chr> <int> <int>
#> 1 Afghanistan 745 2666
#> 2 Brazil 37737 80488
#> 3 China 212258 213766
table2
#> # A tibble: 6 x 4
#> country year cases
#> <chr> <int> <int>
#> 1 Afghanistan 1999 745
#> 2 Afghanistan 2000 2666
#> 3 Brazil 1999 37737
#> 4 Brazil 2000 80488
#> 5 China 1999 212258
#> 6 China 2000 213766

搞明白了什么数据是不整洁的,什么数据是不整洁的之后,今天分享一下如何用R语言整理数据。

tidy data的过程需要用到tidyr包,它是tidyverse的核心包,因此只需加载tidyverse即可,代码如下:

library(tidyverse)


R语言tidy data之Pivot

旋转数据(pivot)

R语言tidy data之Pivot

pivot_longer()和pivot_wider()


tidyr包中有两个很重要的函数:pivot_longer()pivot_wider(),下面具体介绍一下怎么使用。

1. pivot_longer()

就如上面提到的table1一样,我们需要把列名中1999和2000的变成单独的year一列,1999和2000列下对应的值变成单独case一列,如table2所示,此过程增加了数据的行和列,即数据变长的过程。

首先,创建table1,代码如下:

table1 <- tribble(
~country, ~"1999", ~"2000",
#--|--|----
"Afghanistan", 745, 2666,
"Brazil", 37737, 80488,
"China", 212258, 213766
)

注:

①最后一行不需要加逗号(,);

②列名以“~”开始,如果列名不符合变量命名规则(如“不能以数字开头”),应加引号(单引号(’ ‘)或者双引号(" ")都可以);

③列名与值之间可以用“ #--|--|----"进行一个分割。

运行结果如图2:

R语言tidy data之Pivot

图2


创建好table1之后,就可以对数据进行转换了,pivot_longer()使用方法如下,:

table1 %>%
pivot_longer(c("1999", "2000"), names_to = "year", values_to = "cases")

注:

①"1999",和"2000"加引号的原因在于:变量名不能以数字开头,所以要加引号(单双引号都可以);

②"year"和"cases"加引号的原因是:他们原本不属于table1,是单独创建的,因此需将它们的名称加上引号;

%>%为管道(pipe),可以理解为操作连接符,后面在讲。

运行结果如图3:

R语言tidy data之Pivot

图3


2.pivot_wider()

pivot_wider()是与pivot_longer()相反的一个过程。

如table3所示,case与population皆为变量,应该在第一列,而不应放在行中,需将其修改为table4的格式。

table3
#> # A tibble: 12 x 4
#> country year type count
#> <chr> <int> <chr> <int>
#> 1 Afghanistan 1999 cases 745
#> 2 Afghanistan 1999 population 19987071
#> 3 Afghanistan 2000 cases 2666
#> 4 Afghanistan 2000 population 20595360
#> 5 Brazil 1999 cases 37737
#> 6 Brazil 1999 population 172006362
table4
# A tibble: 4 x 4
country year cases population
<chr> <dbl> <dbl> <dbl>
1 "Afghanistan" 1999 745 19987071
2 "Afghanistan" 2000 2666 20595360
3 " Brazil" 1999 37737 NA
4 "Brazil" 1999 NA 172006362

首先,创建table3,代码如下:

table3 <- tribble(
~country,~year,~type,~count,
#--------|--------|------|--------
"Afghanistan", 1999, "cases", 745,
"Afghanistan", 1999, "population", 19987071,
"Afghanistan", 2000, "cases", 2666,
"Afghanistan", 2000, "population", 20595360,
" Brazil", 1999, "cases", 37737,
"Brazil", 1999, "population", 172006362
)
table3

运行结果如图4:

R语言tidy data之Pivot

图4


创建好table3之后,,便可以用pivot_wider()处理了,我们需要把type和count这两个列名替换掉,把type中的case和population变成列名,把count中的值分别变为case和population这两列的值,代码如下:

table3 %>%
pivot_wider(names_from = type, values_from = count)

运行结果如图5所示:


图5



ok,关于pivote的分享就先到这啦,欢迎留言互动~


延伸阅读:


以上是关于R语言tidy data之Pivot的主要内容,如果未能解决你的问题,请参考以下文章

R语言将dataframe数据从长表(long)变为宽表(wide)实战:tidyr包的spread函数cdata包的pivot_to_rowrecs函数data.table包dcast函数

R语言之数据处理常用包

R代码中pivot_longer函数的问题

需要对特定 R 代码片段的解释

R语言使用tidyr包的pivot_longer函数将dataframe从宽表转化为长表

R语言tidyr包pivot_longer函数pivot_wider函数数据表变换实战(长表到宽表宽表到长表)