hadley大神的新作tidyr包,是reshape2的重构,也是由两大函数组成
| package | function1 | function2 |
|---|---|---|
| tidyr | gather | spread |
| reshape2 | melt | cast |
以下内容是学习笔记,详细内容参见Hadley大神的github
Data tidying
tidyr提供了数据集内组织数据的标准方式,不用每次都另起炉灶
Defining tidy data
通过以下定义整齐的数据:
- Data structures(数据结构)。数据集大多数情况下都是行和列组成的数据框,通常有列名,有时候有行名
- Data semantics(数据语义)。数据集是值(数字和字符)的集合。每个值归属于一个变量和一个观测
Tidying messy datasets
以下是5种常见的脏数据集:
- 列名是值,不是变量名。如列名有”<10",">10”之类的分类值10",">
- 列名包括多类型的值
- 变量储存为值
- 不同类型的数据存储在一张表
- 同一类型的数据存储在多张表
以下对5种脏数据集分别进行清理:
列名是值,不是变量名
原数据集
1 | pew = tbl_df(read.csv("pew.csv", stringsAsFactors = FALSE, check.names = FALSE)) |
将<$10k $10-20k $20-30k $30-40k $40-50k $50-75k合为income列,按(religion排序-religion代表以religion分组)
1 | pew %>% |
原数据集
1 | billboard = tbl_df(read.csv("billboard.csv", stringsAsFactors = FALSE)) |
将w1~w76合为week列
1 | billboard2 = billboard %>% |
mutate添加新变量,extract_numeric函数取出week列的数值,date计算week对应的日期,select筛选列
1 | billboard3 = billboard2 %>% |
按artist,track,week排序
1 | billboard3 %>% arrange(artist, track, week) |
列名包括多类型的值
原数据集
1 | tb = tbl_df(read.csv("tb.csv", stringsAsFactors = FALSE)) |
先将m04~fu合为demo列,按iso2和year排序
1 | tb2 = tb %>% |
separate将demo列拆为sex和age,1代表截断的位数,还可以按符号分割
1 | tb3 = tb2 %>% |
变量储存为值
tmax和tmin为变量,但是储存为值
1 | weather = tbl_df(read.csv("weather.csv", stringsAsFactors = FALSE)) |
将d1~d31合为day列
1 | weather2 = weather %>% |
将day列分出数字,select筛选,arrange排序
1 | weather3 = weather2 %>% |
将element拆为tmax和tmin列
1 | weather3 %>% spread(element, value) |
不同类型的数据存储在一张表
unique去除重复值,mutate添加id列
1 | song = billboard3 %>% |
left_join左连接
1 | rank = billboard3 %>% |
同一类型的数据存储在多张表
将多张表里的数据合并到一起
1 | library(plyr) |
gather & spread
- gather. gather(data,key,value)
- spread. spread(data,key,value)
1 | # 原数据 |