reshape2包

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))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容