reshape2

1. 安装导入reshape2

install.packages("reshape2")
library(reshape2)

2. 认识长数据与宽数据

宽数据是我们常见的数据集格式,因为这种格式符合数据收集的习惯和标准,数据集的每一列为一个观测变量,每一行为一组所有观测变量的观测值。宽数据格式看重的是一次观测的各个变量相对应的观测值,所以各个变量是重点,而变量数目一般会比观测数多,这样就显得数据集较宽,故称为宽数据。

> 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

长数据长数据有两个特殊的列:variable和value,variable列用于存放观测变量,value列用于存放观测变量对应的观测值。长数据格式用其特有的variable列和value列将观测结果细分,这在我们对单个变量进行分析而不是对所有变量进行分析时会简便得多,因其将每一个观测变量的观测值分开存储,造成variable列和value列较长,以致整个数据集显得较长,故称为长数据。

> data1 <- melt(airquality)
> head(data1)
  variable value
1    Ozone    41
2    Ozone    36
3    Ozone    12
4    Ozone    18
5    Ozone    NA
6    Ozone    28

3. 核心函数

3.1 melt()函数

melt()函数主要与数据的融合有关。数据的融合是指把数据集重塑为特定的格式,使得每个观测变量独占一行,每行都有唯一确定每个观测变量所需要的标识变量,简单一句就是将宽数据变为长数据。

melt(data, id.vars, measure.vars, variable.name = “variable”, …, na.rm = FALSE, value.name = “value”, factorsAsStrings = TRUE)

data:融合的数据框
id.vars:由标识变量构成的向量,用于标识观测的变量,根据标识标量对其它变量进行“融化”,标识变量本身不进行“融化”。
measure.vars :由观测变量构成的向量,对测量变量进行“融化”,其它变量不进行“融化”。
variable.name:用于保存原始变量名的变量的名称
value.name:用于保存原始值的名称

> data2 <- melt(airquality, id.vars = c('Month', 'Day'))
> print(data2)
    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
7       5   7    Ozone    23
8       5   8    Ozone    19
···
242     7  28  Solar.R   213
243     7  29  Solar.R   275
244     7  30  Solar.R   253
245     7  31  Solar.R   254
246     8   1  Solar.R    83
247     8   2  Solar.R    24
248     8   3  Solar.R    77
249     8   4  Solar.R    NA
250     8   5  Solar.R    NA

在上面的例子中,函数中指定id.vars为Month和Day,因此MonthDay用于观测,并不进行融化,其他变量进行融化。

 data3 <- melt(iris, measure.vars = 'Species')
> data3
    Sepal.Length Sepal.Width Petal.Length Petal.Width variable      value
1            5.1         3.5          1.4         0.2  Species     setosa
2            4.9         3.0          1.4         0.2  Species     setosa
3            4.7         3.2          1.3         0.2  Species     setosa
4            4.6         3.1          1.5         0.2  Species     setosa
5            5.0         3.6          1.4         0.2  Species     setosa
6            5.4         3.9          1.7         0.4  Species     setosa
7            4.6         3.4          1.4         0.3  Species     setosa
8            5.0         3.4          1.5         0.2  Species     setosa
9            4.4         2.9          1.4         0.2  Species     setosa
10           4.9         3.1          1.5         0.1  Species     setosa
11           5.4         3.7          1.5         0.2  Species     setosa
12           4.8         3.4          1.6         0.2  Species     setosa
13           4.8         3.0          1.4         0.1  Species     setosa
14           4.3         3.0          1.1         0.1  Species     setosa

在上面的例子中,measure.vars指定为“Species”,而其他的变量就变成了id.vars,因此其他变量不变,只有“Species”被融化。

3.2 dcast()函数

dcast()函数用于读取已融合的数据框(d是指data frame),并使用formula和用于整合数据的函数把数据集重塑成任意形状:

dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,
  subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))

data:已融合的数据框
formula:用于指定输出的结果集格式
fun.aggregate:用于指定聚合函数,对已聚合的数据执行聚合运算
margins:相当于透视表中的行总计和列总计
subset:选取满足一些特定值的数据,相当于Excel透视表的筛选。例如, subset =.(variable ==“length”)
fill:用于填充结构缺失的值,默认为将fun.aggregate应用于0长度向量的值
value:value列的名称

formula的格式:

rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...

rowvar1 + rowvar2 + ...定义了要划掉的变量集合,以确定各行的内容,而colvar1 + colvar2 + ...则定义了要划掉的、确定各列内容的变量集合。

cast意为“铸造”,将长数据转化为宽数据,作者起的函数名很形象,melt就好像把金属融化,cast则是把融化的金属铸造,两者是相对的。如果你已经理解melt函数,那么cast与之相对就可以理解,那么我们就将之前融化后的data2进行重铸。

> data2 <- melt(airquality, id.vars = c('Month', 'Day'))
> data4 <- dcast(data2, Month + Day ~ variable)
> head(data4)
  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

可以看出重铸后的data4与原来融化之前的data完全一样。
请横屏观看!

image

由于右侧(d、e和f)的公式中并未包括某个函数,所以数据仅被重塑了。反之,左侧的示 例(a、b和c)中指定了mean作为整合函数,从而就对数据同时进行了重塑与整合。例如,(a)中 给出了每个观测所有时刻中在X1和X2上的均值;示例(b)则给出了X1和X2在时刻1和时刻2的均 值,对不同的观测进行了平均;在(c)中则是每个观测在时刻1和时刻2的均值,对不同的X1和X2 进行了平均。

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

推荐阅读更多精彩内容

  • 在实验数据产出之后,绘制图形时存在两个问题,首先是数据录入格式的问题,其次是数据转换的问题。 (一):数据录入[1...
    谢俊飞阅读 865评论 0 2
  • 1.长/宽数据 R语言中,90%的情况下都是使用长型数据,比如构建回归模型,或者利用ggplot2构图,因此当遇到...
    apricoter阅读 2,134评论 1 7
  • 我们在数据分析的过程中经常会碰到不适合分析的数据格式,有的时候我们需要要画图或者建立n重交叉分析表,需要将长数据透...
    鸣人吃土豆阅读 4,148评论 1 18
  • 接上一篇笔记【r<-分析】分析之前,准备数据 很多R用户都搞不太清楚用于修整数据的内置函数(比如stack、uns...
    王诗翔阅读 1,956评论 0 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 123,109评论 2 7