1.長(zhǎng)/寬數(shù)據(jù)
R語言中,90%的情況下都是使用長(zhǎng)型數(shù)據(jù),比如構(gòu)建回歸模型,或者利用ggplot2構(gòu)圖,因此當(dāng)遇到寬型數(shù)據(jù)時(shí),第一時(shí)間就是要把它們轉(zhuǎn)變成長(zhǎng)型數(shù)據(jù)。
①寬型數(shù)據(jù)
每一列為一個(gè)變量,每一行為變量所對(duì)應(yīng)的值
> library(openxlsx)
> data = read.xlsx("/Users/afei/Desktop/test.xlsx")
> head(data)
組別 1月份 2月份 3月份 4月份 5月份 6月份
1 一組 40589 46475 54354 46497 40231 45402
2 二組 49351 54296 42200 47931 39243 41578
3 三組 41983 53099 39552 48860 53591 41799
4 四組 53883 52806 46719 38767 47856 42595
5 五組 41859 46403 45893 43950 51762 50848
6 六組 40231 48046 44355 49756 44490 50003
②長(zhǎng)型數(shù)據(jù)
一列包含了所有的變量,而另一列則是與之相關(guān)的值,長(zhǎng)數(shù)據(jù)不一定只有兩列
組別 月份 value
1 一組 1月份 40589
2 二組 1月份 49351
3 三組 1月份 41983
4 四組 1月份 53883
5 五組 1月份 41859
6 六組 1月份 40231
2.melt
通常,我們會(huì)拿到一個(gè)數(shù)據(jù)表,將其轉(zhuǎn)換為一系列事項(xiàng),然后將其修整為所需的格式。將數(shù)據(jù)表轉(zhuǎn)換成事項(xiàng)列表的過程稱為熔解(melt),將事項(xiàng)列表轉(zhuǎn)換成數(shù)據(jù)表的過程稱為鑄造(cast)。
melt函數(shù):將寬數(shù)據(jù)轉(zhuǎn)換成長(zhǎng)數(shù)據(jù)(逆透視)
cast函數(shù):將長(zhǎng)數(shù)據(jù)轉(zhuǎn)換成寬數(shù)據(jù)(透視)
melt是一個(gè)泛型函數(shù),在reshape2包中有分別用于數(shù)據(jù)框、數(shù)組和列表的melt方法。
melt(data,id.vars,measure.vars,variable.name='variable',...,na.rm=FALSE,value.name='value',factorAsStrings=TRUE)
下面簡(jiǎn)單介紹各個(gè)參數(shù):
#要溶解的數(shù)據(jù)框:data
#ID變量(用于標(biāo)識(shí)觀察的變量):id.vars
#測(cè)量變量(用于描述所測(cè)量的事物的變量):measure.vars
#用于保存原始變量名的變量的名稱:variable.name
#用于保存原始值的名稱:value.name
#告訴melt如何處理NA值:na.rm,na.rm = TRUE刪除NA值
#告訴melt是否要將字符變量轉(zhuǎn)化成因子:factorAsStrings
舉例(此處用R內(nèi)置的airquality數(shù)據(jù)集):
#首先將列名改成小寫
names(airquality) <- tolower(names(airquality))
#查看相應(yīng)的數(shù)據(jù)
head(airquality)

默認(rèn)情況下,melt認(rèn)為所有數(shù)值列的變量均有值。很多情況下,這都是我們想要的情況。如果id.vars和measure.vars都沒有設(shè)置,默認(rèn)會(huì)使用所有的因子變量和字符變量作為ID變量,使用所有的非因子和非字符變量作為測(cè)量變量
#直接用metl函數(shù)處理上述的數(shù)據(jù)
aql <- melt(airquality)
head(aql)

#再看末尾的幾個(gè)數(shù)據(jù)
tail(aql)

數(shù)據(jù)集的熔解是將它重構(gòu)為這樣一種格式:每個(gè)觀測(cè)變量獨(dú)占一行,行中要帶有唯一確定這個(gè)測(cè)量所需的標(biāo)識(shí)變量。
使用id.vars參數(shù)的情況:此時(shí)想知道每個(gè)月(month)以及每天(day)的ozone, solar.r, wind以及temp的值。因此,我們需要告訴melt,month和day是"ID variables"
aql <- melt(airquality, id.vars = c("month", "day"))
head(aql)

使用variable.name和value.name的情況:此時(shí)想修改長(zhǎng)數(shù)據(jù)中的列名
md <- melt(airquality, id.vars = c("month", "day"), value.name = "New_Value", variable.name = "Class")
head(md)

使用measure.vars的情況
ml <- melt(airquality,id.vars = c("month","day"),measure.vars = "ozone")
head(ml)

#再看末尾的幾個(gè)數(shù)據(jù)
tail(ml)

3.cast
①dcast:針對(duì)數(shù)據(jù)框
dcast借助于公式來描述數(shù)據(jù)的形狀,左邊參數(shù)表示"ID variables",而右邊的參數(shù)表示measured variables??赡苄枰獛状螄L試,才能找到合適的公式。
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL, fill = NULL, drop = TRUE,value.var = guess_value(data))
下面簡(jiǎn)單介紹各個(gè)參數(shù):
#已溶解的數(shù)據(jù)框(通常是melt函數(shù)創(chuàng)建的):data
#描述輸出結(jié)果的公式,比如x~y,則x表示數(shù)據(jù)透視表的行,y代表數(shù)據(jù)透視表的列:formula
#聚合函數(shù)。如果要聚合輸出結(jié)果中一溶解的數(shù)據(jù),用這個(gè)參數(shù)可以設(shè)置聚合函數(shù)??梢允褂米远x函數(shù):fun.aggregate
#相當(dāng)于透視表中的行總計(jì)和列總計(jì):margins
#選取滿足一些特定值的數(shù)據(jù),相當(dāng)于Excel透視表的篩選:subset。例如, subset =.(variable ==“l(fā)ength”)
舉例(此處仍使用R內(nèi)置的airquality數(shù)據(jù)集):
#去除缺失值
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)
head(aqm)

#計(jì)算按月份分組的每個(gè)變量的均值以及行列合計(jì)
dcast(aqm, month ~ variable, mean, margins = c("month", "variable"),na.rm=TRUE)

#和上面的例子一樣,對(duì)調(diào)了一下行和列
dcast(aqm, variable ~ month, mean, margins = c("month", "variable"))

②acast:針對(duì)向量、矩陣、數(shù)組
函數(shù)表達(dá)式同dcast,只是輸出結(jié)果不同
acast輸出結(jié)果省略了id這個(gè)列,而dcast則輸出id列
舉例(此處仍使用R內(nèi)置的airquality數(shù)據(jù)集):
dcast(aqm,month~variable,mean)
acast(aqm,month~variable,mean)

#加margins參數(shù)后,仍為以上區(qū)別
dcast(aqm, month ~ variable, mean, margins = TRUE)
acast(aqm, month ~ variable, mean, margins = TRUE)

#只對(duì)列求平均值
dcast(aqm, month ~ variable,mean,margins=c("month"))
acast(aqm, month ~ variable,mean,margins=c("month"))

#只對(duì)行求平均值
dcast(aqm, month ~ variable,mean,margins=c("variable"))
acast(aqm, month ~ variable,mean,margins=c("variable"))

#三維的情況下acast輸出的是一個(gè)數(shù)組,而dcast則報(bào)錯(cuò),因?yàn)閐cast輸出結(jié)果為數(shù)據(jù)框。
dcast(aqm,month ~ day ~ variable)
acast(aqm,month ~ day ~ variable)

#使用subset參數(shù)的情況
library(plyr) #為了使用subset函數(shù)
dcast(aqm,variable~month,mean,subset=.(variable=="ozone"))
acast(aqm,variable~month,mean,subset=.(variable=="ozone"))

dcast(aqm,variable~month,mean,subset=.(month==5))
acast(aqm,variable~month,mean,subset=.(month==5))

dcast(aqm,variable~month,mean,subset=.(variable=="ozone" & month==5))
acast(aqm,variable~month,mean,subset=.(variable=="ozone" & month==5))
