1. 安裝導(dǎo)入reshape2
install.packages("reshape2")
library(reshape2)
2. 認(rèn)識(shí)長(zhǎng)數(shù)據(jù)與寬數(shù)據(jù)
寬數(shù)據(jù)是我們常見(jiàn)的數(shù)據(jù)集格式,因?yàn)檫@種格式符合數(shù)據(jù)收集的習(xí)慣和標(biāo)準(zhǔn)舵鳞,數(shù)據(jù)集的每一列為一個(gè)觀測(cè)變量,每一行為一組所有觀測(cè)變量的觀測(cè)值蚯嫌。寬數(shù)據(jù)格式看重的是一次觀測(cè)的各個(gè)變量相對(duì)應(yīng)的觀測(cè)值渠概,所以各個(gè)變量是重點(diǎn),而變量數(shù)目一般會(huì)比觀測(cè)數(shù)多舶替,這樣就顯得數(shù)據(jù)集較寬令境,故稱(chēng)為寬數(shù)據(jù)。
> 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
長(zhǎng)數(shù)據(jù)長(zhǎng)數(shù)據(jù)有兩個(gè)特殊的列:variable和value顾瞪,variable列用于存放觀測(cè)變量舔庶,value列用于存放觀測(cè)變量對(duì)應(yīng)的觀測(cè)值。長(zhǎng)數(shù)據(jù)格式用其特有的variable列和value列將觀測(cè)結(jié)果細(xì)分陈醒,這在我們對(duì)單個(gè)變量進(jìn)行分析而不是對(duì)所有變量進(jìn)行分析時(shí)會(huì)簡(jiǎn)便得多惕橙,因其將每一個(gè)觀測(cè)變量的觀測(cè)值分開(kāi)存儲(chǔ),造成variable列和value列較長(zhǎng)钉跷,以致整個(gè)數(shù)據(jù)集顯得較長(zhǎng)弥鹦,故稱(chēng)為長(zhǎng)數(shù)據(jù)。
> 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. 核心函數(shù)
3.1 melt()
函數(shù)
melt()
函數(shù)主要與數(shù)據(jù)的融合有關(guān)爷辙。數(shù)據(jù)的融合是指把數(shù)據(jù)集重塑為特定的格式彬坏,使得每個(gè)觀測(cè)變量獨(dú)占一行,每行都有唯一確定每個(gè)觀測(cè)變量所需要的標(biāo)識(shí)變量膝晾,簡(jiǎn)單一句就是將寬數(shù)據(jù)變?yōu)殚L(zhǎng)數(shù)據(jù)栓始。
melt(data, id.vars, measure.vars, variable.name = “variable”, …, na.rm = FALSE, value.name = “value”, factorsAsStrings = TRUE)
data:融合的數(shù)據(jù)框
id.vars:由標(biāo)識(shí)變量構(gòu)成的向量,用于標(biāo)識(shí)觀測(cè)的變量血当,根據(jù)標(biāo)識(shí)標(biāo)量對(duì)其它變量進(jìn)行“融化”混滔,標(biāo)識(shí)變量本身不進(jìn)行“融化”。
measure.vars :由觀測(cè)變量構(gòu)成的向量歹颓,對(duì)測(cè)量變量進(jìn)行“融化”,其它變量不進(jìn)行“融化”油湖。
variable.name:用于保存原始變量名的變量的名稱(chēng)
value.name:用于保存原始值的名稱(chēng)
> 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
在上面的例子中巍扛,函數(shù)中指定id.vars
為Month和Day,因此Month
和Day
用于觀測(cè)乏德,并不進(jìn)行融化撤奸,其他變量進(jìn)行融化。
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()
函數(shù)
dcast()
函數(shù)用于讀取已融合的數(shù)據(jù)框(d是指data frame
),并使用formula
和用于整合數(shù)據(jù)的函數(shù)把數(shù)據(jù)集重塑成任意形狀:
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,
subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))
data:已融合的數(shù)據(jù)框
formula:用于指定輸出的結(jié)果集格式
fun.aggregate:用于指定聚合函數(shù)蘑拯,對(duì)已聚合的數(shù)據(jù)執(zhí)行聚合運(yùn)算
margins:相當(dāng)于透視表中的行總計(jì)和列總計(jì)
subset:選取滿足一些特定值的數(shù)據(jù)钝满,相當(dāng)于Excel透視表的篩選兜粘。例如, subset =.(variable ==“l(fā)ength”)
fill:用于填充結(jié)構(gòu)缺失的值弯蚜,默認(rèn)為將fun.aggregate應(yīng)用于0長(zhǎng)度向量的值
value:value列的名稱(chēng)
formula的格式:
rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
rowvar1 + rowvar2 + ...定義了要?jiǎng)澋舻淖兞考峡字幔源_定各行的內(nèi)容,而colvar1 + colvar2 + ...則定義了要?jiǎng)澋舻乃檗唷⒋_定各列內(nèi)容的變量集合路鹰。
cast意為“鑄造”,將長(zhǎng)數(shù)據(jù)轉(zhuǎn)化為寬數(shù)據(jù)收厨,作者起的函數(shù)名很形象晋柱,melt就好像把金屬融化,cast則是把融化的金屬鑄造帽氓,兩者是相對(duì)的趣斤。如果你已經(jīng)理解melt函數(shù),那么cast與之相對(duì)就可以理解黎休,那么我們就將之前融化后的data2進(jìn)行重鑄浓领。
> 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與原來(lái)融化之前的data完全一樣。
請(qǐng)橫屏觀看势腮!
image
由于右側(cè)(d联贩、e和f)的公式中并未包括某個(gè)函數(shù),所以數(shù)據(jù)僅被重塑了捎拯。反之泪幌,左側(cè)的示 例(a、b和c)中指定了mean作為整合函數(shù)署照,從而就對(duì)數(shù)據(jù)同時(shí)進(jìn)行了重塑與整合祸泪。例如,(a)中 給出了每個(gè)觀測(cè)所有時(shí)刻中在X1和X2上的均值建芙;示例(b)則給出了X1和X2在時(shí)刻1和時(shí)刻2的均 值没隘,對(duì)不同的觀測(cè)進(jìn)行了平均;在(c)中則是每個(gè)觀測(cè)在時(shí)刻1和時(shí)刻2的均值禁荸,對(duì)不同的X1和X2 進(jìn)行了平均右蒲。