美文网首页
2019-07-25 长宽数据转换

2019-07-25 长宽数据转换

作者: 森尼啊 | 来源:发表于2019-07-25 12:38 被阅读0次

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

  • 长数据:一般是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以归为几类),表格整体的形状为长方形,即 变量少而观察值多
  • 宽数据:一般指数据集对所有的变量进行了明确的细分,各变量的值不存在重复循环的情况也无法归类。数据总体的表现为 变量多而观察值少。
  • ① 时间序列数据想要观察多个种类的变量在一段时间内的变化,如上例,宽数据格式无法利用ggplot做出图形。②当数据清洗完成后,导入某些软件时,例如导入SPSS软件时宽数据格式会更好。
  • 函数包
    library(reshape2) # 使用的函数 melt & dcast
    library(tidyr)# 使用的gather & spread

reshape2

主要参考https://www.jianshu.com/p/31d4512ed97fhttps://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

相关文章

  • 2019-07-25 长宽数据转换

    前几次画图,都是在excel中手动粘贴复制,因为数据量比较小,倒也能接受。但是,昨天数据量稍微大些,手动粘贴后再读...

  • 长宽数据转换

    长数据 长数据一般是指数据集中的变量没有做明确的细分,即变量中至少有一个变量中的元素存在值严重重复循环的情况(可以...

  • 长宽数据转换

    reshape2的melt 函数完成 这里我们重点用gather函数(tidyl里面的)1.构建数据集 转换前数据...

  • R数据处理之长宽数据转换

    100天生信-Day6 长数据和宽数据是满足不同分析的两种数据格式,可以很方便用R的reshape2包转换,代码如...

  • 数据排序与长宽型数据的转换

    1. 数据排序 1. sort()函数 对数值进行排序 对字符串进行排序(按首字母顺序) 1.2 rank()函数...

  • 【Hive】再看看如何将宽表转换成长表

    前言 长宽格式数据之间相互转换使用到的函数,可以叫做表格生成函数。前面已经介绍了在 Hive 中如何将长格式数据转...

  • Stata小白系列之四:长宽数据转换

    作者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云) 编者按: 从本期开始,Stata 连享会将推出「St...

  • 【r<-方案】TCGA表达矩阵长宽格式变换

    长宽格式互相转换一文中介绍了如何对数据的两种规整形式——长格式和宽格式进行相互转换,主要的两大利器tidyr(ti...

  • pandas长宽格式的转换

    将宽格式转换为长格式 旋转DataFrame的逆运算是pandas.melt。它不是将一列转换到多个新的DataF...

  • 长宽数据格式比较_归纳分析

    之前写过关于长宽数据转换的文章,而今再看tidyr包,几乎又迷晕进去,所以再次梳理。翻来覆去的实践,其目的在于熟练...

网友评论

      本文标题:2019-07-25 长宽数据转换

      本文链接:https://www.haomeiwen.com/subject/beycrctx.html