R語言tidyr包的使用

reshape2包的進(jìn)化版—tidyr包

tidyr包的作者是Hadley Wickham。這個(gè)包常跟dplyr結(jié)合使用浪耘。

本文將演示tidyr包中下述四個(gè)函數(shù)的用法:

gather—寬數(shù)據(jù)轉(zhuǎn)為長數(shù)據(jù)。類似于reshape2包中的melt函數(shù)

spread—長數(shù)據(jù)轉(zhuǎn)為寬數(shù)據(jù)养篓。類似于reshape2包中的cast函數(shù)

unit—多列合并為一列

separate—將一列分離為多列

下面使用datasets包中的mtcars數(shù)據(jù)集做演示液走。

library(tidyr)

library(dplyr)

head(mtcars)

mpg cyl disp? hp drat? ? wt? qsec vs am gear carb

Mazda RX4? ? ? ? 21.0? 6? 160 110 3.90 2.620 16.46? 0? 1? ? 4? ? 4

Mazda RX4 Wag? ? 21.0? 6? 160 110 3.90 2.875 17.02? 0? 1? ? 4? ? 4

Datsun 710? ? ? ? 22.8? 4? 108? 93 3.85 2.320 18.61? 1? 1? ? 4? ? 1

Hornet 4 Drive? ? 21.4? 6? 258 110 3.08 3.215 19.44? 1? 0? ? 3? ? 1

Hornet Sportabout 18.7? 8? 360 175 3.15 3.440 17.02? 0? 0? ? 3? ? 2

Valiant? ? ? ? ? 18.1? 6? 225 105 2.76 3.460 20.22? 1? 0? ? 3? ? 1

為方便處理,在數(shù)據(jù)集中增加一列car

mtcars$car <- rownames(mtcars)

mtcars <- mtcars[, c(12, 1:11)]

gather

gather的調(diào)用格式為:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

這里挠日,...表示需要聚合的指定列。

與reshape2包中的melt函數(shù)一樣翰舌,得到如下結(jié)果:

mtcarsNew <- mtcars %>% gather(attribute, value, -car)

head(mtcarsNew)

car attribute value

1? ? ? ? Mazda RX4? ? ? mpg? 21.0

2? ? Mazda RX4 Wag? ? ? mpg? 21.0

3? ? ? ? Datsun 710? ? ? mpg? 22.8

4? ? Hornet 4 Drive? ? ? mpg? 21.4

5 Hornet Sportabout? ? ? mpg? 18.7

6? ? ? ? ? Valiant? ? ? mpg? 18.1

tail(mtcarsNew)

car attribute value

347? Porsche 914-2? ? ? carb? ? 2

348? Lotus Europa? ? ? carb? ? 2

349 Ford Pantera L? ? ? carb? ? 4

350? Ferrari Dino? ? ? carb? ? 6

351? Maserati Bora? ? ? carb? ? 8

352? ? Volvo 142E? ? ? carb? ? 2

如你所見嚣潜,除了car列外,其余列聚合成兩列椅贱,分別命名為attribute和value懂算。

tidyr很好的一點(diǎn)是可以只gather若干列而其他列保持不變。如果你想gather在map和gear之間的所有列而保持carb和car列不變庇麦,可以像下面這樣做:

mtcarsNew <- mtcars %>% gather(attribute, value, mpg:gear)

head(mtcarsNew)

car carb attribute value

1? ? ? ? Mazda RX4? ? 4? ? ? mpg? 21.0

2? ? Mazda RX4 Wag? ? 4? ? ? mpg? 21.0

3? ? ? ? Datsun 710? ? 1? ? ? mpg? 22.8

4? ? Hornet 4 Drive? ? 1? ? ? mpg? 21.4

5 Hornet Sportabout? ? 2? ? ? mpg? 18.7

6? ? ? ? ? Valiant? ? 1? ? ? mpg? 18.1

spread

spread的調(diào)用格式為:

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

與reshape2包中的cast函數(shù)一樣计技,得到如下結(jié)果:

mtcarsSpread <- mtcarsNew %>% spread(attribute, value)

head(mtcarsSpread)

car carb? mpg cyl disp? hp drat? ? wt? qsec vs am gear

1? ? ? ? AMC Javelin? ? 2 15.2? 8? 304 150 3.15 3.435 17.30? 0? 0? ? 3

2 Cadillac Fleetwood? ? 4 10.4? 8? 472 205 2.93 5.250 17.98? 0? 0? ? 3

3? ? ? ? Camaro Z28? ? 4 13.3? 8? 350 245 3.73 3.840 15.41? 0? 0? ? 3

4? Chrysler Imperial? ? 4 14.7? 8? 440 230 3.23 5.345 17.42? 0? 0? ? 3

5? ? ? ? Datsun 710? ? 1 22.8? 4? 108? 93 3.85 2.320 18.61? 1? 1? ? 4

6? Dodge Challenger? ? 2 15.5? 8? 318 150 2.76 3.520 16.87? 0? 0? ? 3

unite

unite的調(diào)用格式如下:

unite(data, col, ..., sep = "_", remove = TRUE)

where ... represents the columns to unite and col represents the c

這里,...表示需要合并的列山橄,col表示合并后的列垮媒。

我們先虛構(gòu)一些數(shù)據(jù):

set.seed(1)

date <- as.Date('2016-01-01') + 0:14

hour <- sample(1:24, 15)

min <- sample(1:60, 15)

second <- sample(1:60, 15)

event <- sample(letters, 15)

data <- data.frame(date, hour, min, second, event)

data

date hour min second event

1? 2016-01-01? ? 7? 30? ? 29? ? u

2? 2016-01-02? ? 9? 43? ? 36? ? a

3? 2016-01-03? 13? 58? ? 60? ? l

4? 2016-01-04? 20? 22? ? 11? ? q

5? 2016-01-05? ? 5? 44? ? 47? ? p

6? 2016-01-06? 18? 52? ? 37? ? k

7? 2016-01-07? 19? 12? ? 43? ? r

8? 2016-01-08? 12? 35? ? ? 6? ? i

9? 2016-01-09? 11? 7? ? 38? ? e

10 2016-01-10? ? 1? 14? ? 21? ? b

11 2016-01-11? ? 3? 20? ? 42? ? w

12 2016-01-12? 14? 1? ? 32? ? t

13 2016-01-13? 23? 19? ? 52? ? h

14 2016-01-14? 21? 41? ? 26? ? s

15 2016-01-15? ? 8? 16? ? 25? ? o

現(xiàn)在,我們需要把date航棱,hour睡雇,min和second列合并為新列datetime。通常丧诺,R中的日期時(shí)間格式為"Year-Month-Day-Hour:Min:Second"入桂。

dataNew <- data %>%

unite(datehour, date, hour, sep = ' ') %>%

unite(datetime, datehour, min, second, sep = ':')

dataNew

datetime event

1? 2016-01-01 7:30:29? ? u

2? 2016-01-02 9:43:36? ? a

3? 2016-01-03 13:58:60? ? l

4? 2016-01-04 20:22:11? ? q

5? 2016-01-05 5:44:47? ? p

6? 2016-01-06 18:52:37? ? k

7? 2016-01-07 19:12:43? ? r

8? 2016-01-08 12:35:6? ? i

9? 2016-01-09 11:7:38? ? e

10? 2016-01-10 1:14:21? ? b

11? 2016-01-11 3:20:42? ? w

12? 2016-01-12 14:1:32? ? t

13 2016-01-13 23:19:52? ? h

14 2016-01-14 21:41:26? ? s

15? 2016-01-15 8:16:25? ? o

separate

separate的調(diào)用格式為:

separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,

convert = FALSE, extra = "warn", fill = "warn", ...)

我們可以用separate函數(shù)將數(shù)據(jù)恢復(fù)到剛創(chuàng)建的時(shí)候奄薇,如下所示:

data1 <- dataNew %>%

separate(datetime, c('date', 'time'), sep = ' ') %>%

separate(time, c('hour', 'min', 'second'), sep = ':')

data1

date hour min second event

1? 2016-01-01? 07? 30? ? 29? ? u

2? 2016-01-02? 09? 43? ? 36? ? a

3? 2016-01-03? 13? 59? ? 00? ? l

4? 2016-01-04? 20? 22? ? 11? ? q

5? 2016-01-05? 05? 44? ? 47? ? p

6? 2016-01-06? 18? 52? ? 37? ? k

7? 2016-01-07? 19? 12? ? 43? ? r

8? 2016-01-08? 12? 35? ? 06? ? i

9? 2016-01-09? 11? 07? ? 38? ? e

10 2016-01-10? 01? 14? ? 21? ? b

11 2016-01-11? 03? 20? ? 42? ? w

12 2016-01-12? 14? 01? ? 32? ? t

13 2016-01-13? 23? 19? ? 52? ? h

14 2016-01-14? 21? 41? ? 26? ? s

15 2016-01-15? 08? 16? ? 25? ? o

首先驳阎,將datetime分為date列和time列。然后馁蒂,將time列分為hour呵晚,min,second列沫屡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饵隙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沮脖,更是在濱河造成了極大的恐慌金矛,老刑警劉巖芯急,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驶俊,居然都是意外死亡娶耍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門饼酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榕酒,“玉大人,你說我怎么就攤上這事故俐∠胗ィ” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵药版,是天一觀的道長辑舷。 經(jīng)常有香客問我,道長槽片,這世上最難降的妖魔是什么惩妇? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮筐乳,結(jié)果婚禮上歌殃,老公的妹妹穿的比我還像新娘。我一直安慰自己蝙云,他們只是感情好氓皱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勃刨,像睡著了一般波材。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上身隐,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天廷区,我揣著相機(jī)與錄音,去河邊找鬼贾铝。 笑死隙轻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垢揩。 我是一名探鬼主播玖绿,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叁巨!你這毒婦竟也來了斑匪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤锋勺,失蹤者是張志新(化名)和其女友劉穎蚀瘸,沒想到半個(gè)月后狡蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贮勃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年牢酵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衙猪。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馍乙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垫释,到底是詐尸還是另有隱情丝格,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布棵譬,位于F島的核電站显蝌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏订咸。R本人自食惡果不足惜曼尊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脏嚷。 院中可真熱鬧骆撇,春花似錦、人聲如沸父叙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾唱。三九已至涌乳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甜癞,已是汗流浹背夕晓。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悠咱,地道東北人蒸辆。 一個(gè)月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像乔煞,于是被迫代替她去往敵國和親吁朦。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 最近在寫個(gè)性化推薦的論文渡贾,經(jīng)常用到Python來處理數(shù)據(jù),被pandas和numpy中的數(shù)據(jù)選取和索引問題繞的比較...
    shuhanrainbow閱讀 4,543評論 6 19
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評論 6 13
  • 不知道是不是因?yàn)榍皟赡赀\(yùn)動(dòng)傷到膝蓋的原因雄右,這兩年打不了籃球空骚,但是卻養(yǎng)成了看籃球的習(xí)慣纺讲,周末的休息時(shí)光都喜歡自己在家...
    allllllen閱讀 233評論 0 0
  • 小的時(shí)候我有很多的夢想 。我想去特別多的地方去旅行囤屹,比如杭州西湖熬甚,沿海廈門,還有四季如春的云南肋坚。不過到目前...
    今年很流行閱讀 274評論 0 0
  • 此書屬于雜文隨筆作品集乡括,涉及思想文化討論、日常生活發(fā)掘的真知灼見智厌、社會(huì)科學(xué)研究的評論诲泌、還有域外生活的雜感及對社會(huì)現(xiàn)...
    DTttt閱讀 2,469評論 0 0