2019-07-25 长宽数据转换

2019-07-25  本文已影响0人  森尼啊

前几次画图,都是在excel中手动粘贴复制,因为数据量比较小,倒也能接受。但是,昨天数据量稍微大些,手动粘贴后再读入R中,数据格式都变了,最后放弃,都是泪。现在才知道长款数据转换,亡羊补牢吧。。。

reshape2

主要参考https://www.jianshu.com/p/31d4512ed97fhttps://blog.csdn.net/ray_zhu/article/details/78679913

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数据集

> 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
上一篇 下一篇

猜你喜欢

热点阅读