2019-07-25 长宽数据转换

前几次画图,都是在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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343