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 | # 原数据 |