R语言tidy data之Pivot
Posted 五李三张
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言tidy data之Pivot相关的知识,希望对你有一定的参考价值。
每次拿到手里的数据,总是乱的,而且不一定是自己想要的那种格式,用R语言画图时,其前提也必然时数据要整洁规范。今天主要讲两点:①何为整洁的数据?②如何使用Pivot来tidy data。
正文共:2432 字 6 图
预计阅读时间: 7 分钟
何为整洁的数据
如图1所示,若用R语言可视化,数据的组织形式必须是:列名为变量名,每行中的值都为已知的确定值(缺失值NA也算)。
图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)
旋转数据(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:
图2
创建好table1之后,就可以对数据进行转换了,pivot_longer()
使用方法如下,:
table1 %>%
pivot_longer(c("1999", "2000"), names_to = "year", values_to = "cases")
注:
①"1999",和"2000"加引号的原因在于:变量名不能以数字开头,所以要加引号(单双引号都可以);
②"year"和"cases"加引号的原因是:他们原本不属于table1,是单独创建的,因此需将它们的名称加上引号;
③%>%
为管道(pipe),可以理解为操作连接符,后面在讲。
运行结果如图3:
图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:
图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函数