r语言tidyverse教程:3数据重塑tidyr
文章目录
- 宽数据和长数据
- 长宽数据转换
- 合并和分割列
- 函数参数
R语言系列:
- 编程基础💎循环语句💎向量、矩阵和数组💎列表、数据帧
- 排序函数💎apply系列函数
- tidyverse:readr💎tibble💎tidyr
tidyr
顾名思义就是让数据更整齐,而让数据变得整齐的方法,就是调整行列,在tidyr
中,有下列4各函数用于行列转换
gather
:宽数据->长数据,聚行成列spread
:长数据->宽数据,展列为行unite
:多列合并为一列separate
:一列分离为多列
宽数据和长数据
为了理解这个包的意义,需要先学习两个概念:宽数据和长数据。
宽数据的特点是,每一列代表一个属性,每一行代表一个个体。例如下面这个表格就是宽数据
姓名 | 年龄 | 性别 |
---|---|---|
张三 | 18 | 男 |
李四 | 19 | 女 |
… | … | … |
长数据则会把上面的表头和值做一个一一对应,然后罗列出来,每一行都是一对"变量-值"
变量 | 值 |
---|---|
姓名 | 张三 |
姓名 | 李四 |
年龄 | 18 |
年龄 | 19 |
性别 | 男 |
性别 | 女 |
但这样的转换过于粗暴,会导致属于相同个体的不同属性完全分开,无法恢复。所以一种更加安全的转换方式可以为
姓名 | 变量 | 值 |
---|---|---|
张三 | 年龄 | 18 |
李四 | 年龄 | 19 |
张三 | 性别 | 男 |
李四 | 性别 | 女 |
长宽数据转换
tidyr
中的gather
和spread
用于长数据和宽数据之间的转换,为了测试这两个函数,先创建一个变量
test <- data.frame(姓名=c("张三", "李四", "王五"), 年龄=c(18,19,20), 性别=c("男", "女", "男"), 成绩=c(95,96,97))
test
"
姓名 年龄 性别 成绩
1 张三 18 男 95
2 李四 19 女 96
3 王五 20 男 97
"
然后用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
接下来再用spread
对gTest
进行分割,果然又恢复了原样。
> sTest <- spread(gTest, key=key, value=value)
>
> sTest
姓名 成绩 年龄 性别
1 李四 96 19 女
2 王五 97 20 男
3 张三 95 18 男
合并和分割列
unit
函数可以将数据框中的多列合并成一列,separate
与之相反。
下面在test
中新插入一列id
> test$id <- c(1,2,3)
> test
姓名 年龄 性别 成绩 id
1 张三 18 男 95 1
2 李四 19 女 96 2
3 王五 20 男 97 3
由于id
和名字是一一对应的,所以二者可以合并在一起
uTest <- unite(test, 人物, id, 姓名, sep='.')
uTest
"
人物 年龄 性别 成绩
1 1.张三 18 男 95
2 2.李四 19 女 96
3 3.王五 20 男 97
"
可以看到,id
和姓名
这两列通过.
连接,合并在了一起,并且得到了新的列名人物
。
接下来,通过separate
将这列再分开
# 这里有个坑,如果分隔符是英文句号,需要用双斜线转义
sepTest <- separate(uTest, 人物, c('id', '姓名'), sep='\\.')
结果为
> sepTest
id 姓名 年龄 性别 成绩
1 1 张三 18 男 95
2 2 李四 19 女 96
3 3 王五 20 男 97
函数参数
最后,将这四个函数的声明列出来,来看一看其参数列表
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
等均在前面演示过,其他参数含义如下
- 由于
gather
和spread
涉及到长数据,而长数据是由键值对构成的,所以二者包含key
和value
的选项。 na.rm
为布尔型,为T
时将删除缺失值convert
为T
时,进行数据类型转换factor_key
为F
时,自动转为字符串,否则转为因子spread, separate
都涉及到一列转为多列的操作,故而由fill
参数,用于替换缺失值remove
为T
时,保留参与组合的列