前几次画图,都是在excel中手动粘贴复制,因为数据量比较小,倒也能接受。但是,昨天数据量稍微大些,手动粘贴后再读入R中,数据格式都变了,最后放弃,都是泪。现在才知道长款数据转换,亡羊补牢吧。。。
- 长数据:一般是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类),表格整体的形状为长方形,即 变量少而观察值多
- 宽数据:一般指数据集对所有的变量进行了明确的细分,各变量的值不存在重复循环的情况也无法归类。数据总体的表现为 变量多而观察值少。
- ① 时间序列数据想要观察多个种类的变量在一段时间内的变化,如上例,宽数据格式无法利用ggplot做出图形。②当数据清洗完成后,导入某些软件时,例如导入SPSS软件时宽数据格式会更好。
- 函数包
library(reshape2) # 使用的函数 melt & dcast
library(tidyr)# 使用的gather & spread
reshape2
主要参考https://www.jianshu.com/p/31d4512ed97f 和 https://blog.csdn.net/ray_zhu/article/details/78679913
-
melt
函数对宽数据→长数据; -
cast
函数对长数据→宽数据;
melt(),使用内置airqualiity数据集
> rm(list = ls())
> library(reshape2)
> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> aql <- melt(airquality) # [a]ir [q]uality [l]ong format
No id variables; using all as measure variables
> head(aql)
variable value
1 Ozone 41
2 Ozone 36
3 Ozone 12
4 Ozone 18
5 Ozone NA
6 Ozone 28
默认情况下,melt认为所有数值列的变量均有值。很多情况下,这都是我们想要的情况。在这里,我们想知道每个月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我们需要告诉melt,month和day是"ID variables"。ID variables就是那些能够区分不同行数据的变量,个人感觉类似于数据库中的主键。
> aql <- melt(airquality, id.vars = c("Month", "Day"))
> head(aql)
Month Day variable value
1 5 1 Ozone 41
2 5 2 Ozone 36
3 5 3 Ozone 12
4 5 4 Ozone 18
5 5 5 Ozone NA
6 5 6 Ozone 28
>
> #修改数据名
> aql <- melt(airquality, id.vars = c("Month", "Day"),
+ variable.name = "climate_variable",
+ value.name = "climate_value")
> head(aql)
Month Day climate_variable climate_value
1 5 1 Ozone 41
2 5 2 Ozone 36
3 5 3 Ozone 12
4 5 4 Ozone 18
5 5 5 Ozone NA
6 5 6 Ozone 28
>
cast(),使用内置airqualiity数据集
> #接上
> aql <- melt(airquality, id.vars = c("Month", "Day"))
> head(aql)
Month Day variable value
1 5 1 Ozone 41
2 5 2 Ozone 36
3 5 3 Ozone 12
4 5 4 Ozone 18
5 5 5 Ozone NA
6 5 6 Ozone 28
> aqw <- dcast(aql, Month + Day ~ variable)
> head(aqw)
Month Day Ozone Solar.R Wind Temp
1 5 1 41 190 7.4 67
2 5 2 36 118 8.0 72
3 5 3 12 149 12.6 74
4 5 4 18 313 11.5 62
5 5 5 NA NA 14.3 56
6 5 6 28 NA 14.9 66
> aqw2 <- dcast(aql, Month ~ variable)
Aggregation function missing: defaulting to length
id.vars由Month,Day到只有其中一个Month 的时候,dcast会使得每个单元有多个数据,dcast如何聚合(aggregate)这些数据,比如取均值(mean),中位数(median),求和(sum)。比如,我们简单的计算下均值,同时通过na.rm = TRUE删除NA值
> aqw3 <- dcast(aql, Month ~ variable, fun.aggregate = mean, na.rm = TRUE)
> head(aqw3)
Month Ozone Solar.R Wind Temp
1 5 23.61538 181.2963 11.622581 65.54839
2 6 29.44444 190.1667 10.266667 79.10000
3 7 59.11538 216.4839 8.941935 83.90323
4 8 59.96154 171.8571 8.793548 83.96774
5 9 31.44828 167.4333 10.180000 76.90000
tidyr,使用内置airqualiity数据集
-
gather
函数对宽数据→长数据; -
spread
函数对长数据→宽数据;
参照了cheatsheet,里面tidydata的部分介绍了gather()和spread()的用途,非常简洁清晰https://github.com/rstudio/cheatsheets/blob/master/data-import.pdf。以后百度中文教程,直接谷歌函数,到这个cheatsheet来,非常省时间。
> rm(list = ls())
> library(tidyr)
> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> daql <- gather(airquality,Ozone,Solar.R, Wind,Temp,key = "variable",value ="value")
> head(daql)
Month Day variable value
1 5 1 Ozone 41
2 5 2 Ozone 36
3 5 3 Ozone 12
4 5 4 Ozone 18
5 5 5 Ozone NA
6 5 6 Ozone 28
> #key和value参数放入合并后的重命名
> daqw <- spread(daql,variable,value)
> head(daqw)
Month Day Ozone Solar.R Temp Wind
1 5 1 41 190 67 7.4
2 5 2 36 118 72 8.0
3 5 3 12 149 74 12.6
4 5 4 18 313 62 11.5
5 5 5 NA NA 56 14.3
6 5 6 28 NA 66 14.9