R 長型和寬型數(shù)據(jù)的相互轉(zhuǎn)換

長型和寬型數(shù)據(jù)在數(shù)據(jù)分析中非常常見水由。一般人們看到的以行為樣本以列為變量的數(shù)據(jù)為寬型數(shù)據(jù),非常適合人類查看和理解赛蔫。但是在數(shù)據(jù)分析中砂客,常常需要將數(shù)據(jù)轉(zhuǎn)換成長型數(shù)據(jù)才能便于分析和作圖。將在以下幾個(gè)例子中進(jìn)行理解和介紹呵恢。同時(shí)使用R中不同的三個(gè)包進(jìn)行長寬數(shù)據(jù)的轉(zhuǎn)換鞠值。
我們先建立一個(gè)簡單的數(shù)據(jù)框:

widedata <- data.frame(ID=c(1,1,2,2),
                       Time=c(1,2,1,2),
                       x1=c(3,4,5,6),
                       x2=c(7,8,9,10))
widedata

查看數(shù)據(jù)框如下:


1.png

這是寬型數(shù)據(jù),如果還是明白的話渗钉,跟長型數(shù)據(jù)一對比就一目了然了彤恶。

1. 用reshape進(jìn)行數(shù)據(jù)的長寬轉(zhuǎn)換

Wide to long

library(reshape)
(longdata1 <- melt(widedata,id=c("ID","Time")))
2.png
(longdata1 <- melt(widedata,id="ID"))

3.png

這兩個(gè)數(shù)據(jù)框都是長型數(shù)據(jù),根據(jù)前幾列的信息可以對應(yīng)到最后數(shù)值列的唯一值
reshape包的melt函數(shù)使用相對簡單鳄橘,出了第一個(gè)對象為數(shù)據(jù)框声离,參數(shù)一般只有一個(gè),即id瘫怜,設(shè)為id的變量术徊,變量名在轉(zhuǎn)換過程中不變,但是變量的數(shù)值會在長型數(shù)據(jù)中重復(fù)出現(xiàn)鲸湃。
Long to wide
cast(data, formula = ... ~ variable, fun.aggregate=NULL, ..., margins=FALSE, subset=TRUE, df=FALSE, fill=NULL, add.missing=FALSE, value = guess_value(data))
cast函數(shù)有參數(shù)比較多赠涮,這里只展示基本的參數(shù)子寓,其中formula是設(shè)置如何轉(zhuǎn)換為寬型數(shù)據(jù)的重要參數(shù),不同的formula轉(zhuǎn)換成的數(shù)據(jù)可以通過嘗試進(jìn)行理解和體會笋除。

(widedata1 <- cast(longdata1,ID+Time~variable))
(widedata1 <- cast(longdata1,ID~Time+variable))
(widedata1 <- cast(longdata1,ID~variable+Time))
4.png

5.png

6.png

2. 用reshape2進(jìn)行數(shù)據(jù)的長寬轉(zhuǎn)換

Wide to long
reshape2同時(shí)使用melt函數(shù)進(jìn)行寬到長數(shù)據(jù)的轉(zhuǎn)換斜友,但是參數(shù)略有不同,主要的兩個(gè)參數(shù)是id.vars和measure.vars.

library(reshape2)
(longdata2 <- melt(widedata,id.vars=c("ID","Time"),measure.vars=c("x1","x2")))

7.png

得到跟reshape包中melt函數(shù)一樣的結(jié)果垃它。
Long to wide
長型數(shù)據(jù)到寬型數(shù)據(jù)的轉(zhuǎn)換鲜屏,在reshape2中沒有cast函數(shù),根據(jù)處理數(shù)據(jù)的不同類型嗤瞎,用acast(vector/matrix/array)和dcast(dataframe)函數(shù)取代墙歪。
這里我們的數(shù)據(jù)是數(shù)據(jù)框听系,因此使用dcast函數(shù)贝奇,其中的公式跟cast類似。

(widedata2 <- dcast(longdata2,ID+Time~variable))
(widedata2 <- dcast(longdata2,ID~Time+variable))
8.png

3. 用tidyr進(jìn)行數(shù)據(jù)的長寬轉(zhuǎn)換

Wide to long
tidyr中的gather函數(shù)靠胜,跟reshape和reshape2中的melt函數(shù)的參數(shù)有較大的改變掉瞳,但是更容易理解。
gather(data, key = "key", value = "value", ..., na.rm = FALSE, convert = FALSE, factor_key = FALSE)
其中的key和value生成新的變量的變量名浪漠,...表示可以要進(jìn)行轉(zhuǎn)換的變量陕习,相當(dāng)于reshape2中melt函數(shù)的measure.vars參數(shù)。直接看例子:

library(tidyr)
(longdata3 <- gather(widedata, key = "variable",value ="value", x1:x2 ))

9.png

得到跟上面相同的結(jié)果址愿,這里variable和value是自己命名的该镣,不同于melt是自動(dòng)生成的,相對更易于理解响谓。
Long to wide
tidyr中的spread函數(shù)损合,跟cast類似,不過參數(shù)與gather相對應(yīng)
spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE, sep = NULL)
關(guān)鍵的參數(shù)是key和value娘纷,指定后就可以根據(jù)相應(yīng)的key和value進(jìn)行長到寬的轉(zhuǎn)換

(widedata3 <- spread(longdata3,key = "variable",value = "value"))
10.png

總結(jié)

初學(xué)者在使用R時(shí)嫁审,常常對reshape和reshape2有點(diǎn)迷惑,尤其是melt函數(shù)名字一模一樣赖晶,因此容易造成誤解律适,加載了reshape2后發(fā)現(xiàn)cast函數(shù)不能使用。個(gè)人傾向于直接使用gather和spread函數(shù)遏插,直接跳過reshape和reshape2的困擾捂贿。不過理清楚reshape和reshape2的主要區(qū)別,使用起來也不容易混淆胳嘲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厂僧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胎围,更是在濱河造成了極大的恐慌吁系,老刑警劉巖德召,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汽纤,居然都是意外死亡上岗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蕴坪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肴掷,“玉大人,你說我怎么就攤上這事背传〈粽埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵径玖,是天一觀的道長痴脾。 經(jīng)常有香客問我,道長梳星,這世上最難降的妖魔是什么赞赖? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮冤灾,結(jié)果婚禮上前域,老公的妹妹穿的比我還像新娘。我一直安慰自己韵吨,他們只是感情好匿垄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著归粉,像睡著了一般椿疗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盏浇,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天变丧,我揣著相機(jī)與錄音,去河邊找鬼绢掰。 笑死痒蓬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滴劲。 我是一名探鬼主播攻晒,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼班挖!你這毒婦竟也來了鲁捏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萧芙,失蹤者是張志新(化名)和其女友劉穎给梅,沒想到半個(gè)月后假丧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡动羽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年包帚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运吓。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渴邦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拘哨,到底是詐尸還是另有隱情谋梭,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布倦青,位于F島的核電站瓮床,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姨夹。R本人自食惡果不足惜纤垂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一矾策、第九天 我趴在偏房一處隱蔽的房頂上張望磷账。 院中可真熱鬧,春花似錦贾虽、人聲如沸逃糟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绰咽。三九已至,卻和暖如春地粪,著一層夾襖步出監(jiān)牢的瞬間取募,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工蟆技, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玩敏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓质礼,卻偏偏與公主長得像旺聚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子眶蕉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354