2019-11-25 R語言中的數據處理包dplyr、tidyr筆記

來源:https://www.cnblogs.com/yjd_hycf_space/p/6686141.html
dplyr包是Hadley Wickham的新作,主要用于數據清洗和整理,該包專注dataframe數據格式,從而大幅提高了數據處理速度,并且提供了與其它數據庫的接口;tidyr包的作者是Hadley Wickham, 該包用于“tidy”你的數據,這個包常跟dplyr結合使用。

本文將介紹dplyr包的下述五個函數用法:

篩選: filter()
排列: arrange()
選擇: select()
變形: mutate()
匯總: summarise()
分組: group_by()
以及tidyr包的下述四個函數用法:

gather—寬數據轉為長數據;
spread—長數據轉為寬數據;
unit—多列合并為一列;
separate—將一列分離為多列;
 dplyr、tidyr包安裝及載入

install.packages("dplyr")
install.packages("tidyr")

library(dplyr)
library(tidyr)
使用datasets包中的mtcars數據集做演示,首先將過長的數據整理成友好的tbl_df數據:

mtcars_df = tbl_df(mtcars)
dplyr包基本操作

1.1 篩選: filter()

按給定的邏輯判斷篩選出符合要求的子數據集

filter(mtcars_df,mpg==21,hp==110)

A tibble: 2 x 11

mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb

<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21 6 160 110 3.9 2.620 16.46 0 1 4 4
2 21 6 160 110 3.9 2.875 17.02 0 1 4 4
 1.2 排列: arrange()

按給定的列名依次對行進行排序:

arrange(mtcars_df, disp) #可對列名加 desc(disp) 進行倒序

A tibble: 32 x 11

 mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb

<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
2 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
3 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
4 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
5 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
6 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
7 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
8 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
9 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
10 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2

... with 22 more rows

1.3 選擇: select()

用列名作參數來選擇子數據集:

select(mtcars_df, disp:wt)

A tibble: 32 x 4

disp    hp  drat    wt
  • <dbl> <dbl> <dbl> <dbl>
    1 160.0 110 3.90 2.620
    2 160.0 110 3.90 2.875
    3 108.0 93 3.85 2.320
    4 258.0 110 3.08 3.215
    5 360.0 175 3.15 3.440
    6 225.0 105 2.76 3.460
    7 360.0 245 3.21 3.570
    8 146.7 62 3.69 3.190
    9 140.8 95 3.92 3.150
    10 167.6 123 3.92 3.440

... with 22 more rows

1.4 變形: mutate()

對已有列進行數據運算并添加為新列:

mutate(mtcars_df,
NO = 1:dim(mtcars_df)[1])

A tibble: 32 x 12

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

<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 2
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3
4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 4
5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 5
6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 6
7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 7
8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 8
9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 9
10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 10

... with 22 more rows

1.5 匯總: summarise()

對數據框調用其它函數進行匯總操作, 返回一維的結果:

summarise(mtcars_df,
mdisp = mean(disp, na.rm = TRUE))

A tibble: 1 x 1

 mdisp
 <dbl>

1 230.7219
 1.6 分組: group_by()

當對數據集通過group_by()添加了分組信息后,mutate(),arrange() 和 summarise() 函數會自動對這些 tbl 類數據執行分組操作。

cars <- group_by(mtcars_df, cyl)
countcars <- summarise(cars, count = n()) # count = n()用來計算次數

A tibble: 3 x 2

cyl count

<dbl> <int>
1 4 11
2 6 7
3 8 14
tidyr包基本操作

2.1 寬轉長:gather()

使用gather()函數實現寬表轉長表,語法如下:

gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
data:需要被轉換的寬形表
key:將原數據框中的所有列賦給一個新變量key
value:將原數據框中的所有值賦給一個新變量value
…:可以指定哪些列聚到同一列中
na.rm:是否刪除缺失值

widedata <- data.frame(person=c('Alex','Bob','Cathy'),grade=c(2,3,4),score=c(78,89,88))
widedata
person grade score
1 Alex 2 78
2 Bob 3 89
3 Cathy 4 88
longdata <- gather(widedata, variable, value,-person)
longdata
person variable value
1 Alex grade 2
2 Bob grade 3
3 Cathy grade 4
4 Alex score 78
5 Bob score 89
6 Cathy score 88
 2.2 長轉寬:spread()

有時,為了滿足建模或繪圖的要求,往往需要將長形表轉換為寬形表,或將寬形表變為長形表。如何實現這兩種數據表類型的轉換。使用spread()函數實現長表轉寬表,語法如下:

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:為需要轉換的長形表
key:需要將變量值拓展為字段的變量
value:需要分散的值
fill:對于缺失值,可將fill的值賦值給被轉型后的缺失值

mtcarsSpread <- mtcarsNew %>% spread(attribute, value)
head(mtcarsSpread)
car am carb cyl disp drat gear hp mpg qsec vs wt
1 AMC Javelin 0 2 8 304 3.15 3 150 15.2 17.30 0 3.435
2 Cadillac Fleetwood 0 4 8 472 2.93 3 205 10.4 17.98 0 5.250
3 Camaro Z28 0 4 8 350 3.73 3 245 13.3 15.41 0 3.840
4 Chrysler Imperial 0 4 8 440 3.23 3 230 14.7 17.42 0 5.345
5 Datsun 710 1 1 4 108 3.85 4 93 22.8 18.61 1 2.320
6 Dodge Challenger 0 2 8 318 2.76 3 150 15.5 16.87 0 3.520
 2.3 合并:unit()

unite的調用格式如下:

unite(data, col, …, sep = “_”, remove = TRUE)
data:為數據框
col:被組合的新列名稱
…:指定哪些列需要被組合
sep:組合列之間的連接符,默認為下劃線
remove:是否刪除被組合的列

wideunite<-unite(widedata, information, person, grade, score, sep= "-")
wideunite
information
1 Alex-2-78
2 Bob-3-89
3 Cathy-4-88
 2.4 拆分:separate()

separate()函數可將一列拆分為多列,一般可用于日志數據或日期時間型數據的拆分,語法如下:

separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,
convert = FALSE, extra = “warn”, fill = “warn”, …)
data:為數據框
col:需要被拆分的列
into:新建的列名,為字符串向量
sep:被拆分列的分隔符
remove:是否刪除被分割的列

widesep <- separate(wideunite, information,c("person","grade","score"), sep = "-")
widesep
person grade score
1 Alex 2 78
2 Bob 3 89
3 Cathy 4 88
可見separate()函數和unite()函數的功能相反。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容