dplyr包是Hadley Wickham的新作,主要用于數(shù)據(jù)清洗和整理,該包專注dataframe數(shù)據(jù)格式,從而大幅提高了數(shù)據(jù)處理速度,并且提供了與其它數(shù)據(jù)庫的接口;tidyr包的作者是Hadley Wickham, 該包用于“tidy”你的數(shù)據(jù),這個(gè)包常跟dplyr結(jié)合使用。
本文將介紹dplyr包的下述五個(gè)函數(shù)用法: 篩選: filter() 排列: arrange() 選擇: select() 變形: mutate() 匯總: summarise() 分組: group_by()
以及tidyr包的下述四個(gè)函數(shù)用法: dplyr、tidyr包安裝及載入install.packages("dplyr")install.packages("tidyr")library(dplyr)library(tidyr)
使用datasets包中的mtcars數(shù)據(jù)集做演示,首先將過長的數(shù)據(jù)整理成友好的tbl_df數(shù)據(jù): mtcars_df = tbl_df(mtcars)
dplyr包基本操作1.1 篩選: filter()按給定的邏輯判斷篩選出符合要求的子數(shù)據(jù)集 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 42 21 6 160 110 3.9 2.875 17.02 0 1 4 4
1.2 排列: arrange()按給定的列名依次對(duì)行進(jìn)行排序: arrange(mtcars_df, disp) #可對(duì)列名加 desc(disp) 進(jìn)行倒序
# 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()用列名作參數(shù)來選擇子數(shù)據(jù)集: 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.6202 160.0 110 3.90 2.8753 108.0 93 3.85 2.3204 258.0 110 3.08 3.2155 360.0 175 3.15 3.4406 225.0 105 2.76 3.4607 360.0 245 3.21 3.5708 146.7 62 3.69 3.1909 140.8 95 3.92 3.15010 167.6 123 3.92 3.440# ... with 22 more rows
1.4 變形: mutate()對(duì)已有列進(jìn)行數(shù)據(jù)運(yùn)算并添加為新列: 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 12 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 23 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 34 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 45 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 56 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 67 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 78 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 89 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 910 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 10# ... with 22 more rows
1.5 匯總: summarise()對(duì)數(shù)據(jù)框調(diào)用其它函數(shù)進(jìn)行匯總操作, 返回一維的結(jié)果: summarise(mtcars_df,
mdisp = mean(disp, na.rm = TRUE))# A tibble: 1 x 1
mdisp
<dbl>1 230.7219
1.6 分組: group_by()當(dāng)對(duì)數(shù)據(jù)集通過group_by()添加了分組信息后,mutate(),arrange() 和 summarise() 函數(shù)會(huì)自動(dòng)對(duì)這些 tbl 類數(shù)據(jù)執(zhí)行分組操作。 cars <- group_by(mtcars_df, cyl)countcars <- summarise(cars, count = n()) # count = n()用來計(jì)算次數(shù)# A tibble: 3 x 2
cyl count
<dbl> <int>1 4 11
2 6 7
3 8 14
tidyr包基本操作2.1 寬轉(zhuǎn)長:gather()使用gather()函數(shù)實(shí)現(xiàn)寬表轉(zhuǎn)長表,語法如下: gather(data, key, value, …, na.rm = FALSE, convert = FALSE)data:需要被轉(zhuǎn)換的寬形表key:將原數(shù)據(jù)框中的所有列賦給一個(gè)新變量keyvalue:將原數(shù)據(jù)框中的所有值賦給一個(gè)新變量value
…:可以指定哪些列聚到同一列中na.rm:是否刪除缺失值widedata <- data.frame(person=c('Alex','Bob','Cathy'),grade=c(2,3,4),score=c(78,89,88))widedata
person grade score1 Alex 2 782 Bob 3 893 Cathy 4 88longdata <- gather(widedata, variable, value,-person)longdata
person variable value1 Alex grade 22 Bob grade 33 Cathy grade 44 Alex score 785 Bob score 896 Cathy score 88
2.2 長轉(zhuǎn)寬:spread()有時(shí),為了滿足建?;蚶L圖的要求,往往需要將長形表轉(zhuǎn)換為寬形表,或?qū)捫伪碜優(yōu)殚L形表。如何實(shí)現(xiàn)這兩種數(shù)據(jù)表類型的轉(zhuǎn)換。使用spread()函數(shù)實(shí)現(xiàn)長表轉(zhuǎn)寬表,語法如下: spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)data:為需要轉(zhuǎn)換的長形表key:需要將變量值拓展為字段的變量value:需要分散的值
fill:對(duì)于缺失值,可將fill的值賦值給被轉(zhuǎn)型后的缺失值
mtcarsSpread <- mtcarsNew %>% spread(attribute, value)head(mtcarsSpread)
car am carb cyl disp drat gear hp mpg qsec vs wt1 AMC Javelin 0 2 8 304 3.15 3 150 15.2 17.30 0 3.4352 Cadillac Fleetwood 0 4 8 472 2.93 3 205 10.4 17.98 0 5.2503 Camaro Z28 0 4 8 350 3.73 3 245 13.3 15.41 0 3.8404 Chrysler Imperial 0 4 8 440 3.23 3 230 14.7 17.42 0 5.3455 Datsun 710 1 1 4 108 3.85 4 93 22.8 18.61 1 2.3206 Dodge Challenger 0 2 8 318 2.76 3 150 15.5 16.87 0 3.520
2.3 合并:unit()unite的調(diào)用格式如下: unite(data, col, …, sep = “_”, remove = TRUE)data:為數(shù)據(jù)框col:被組合的新列名稱
…:指定哪些列需要被組合sep:組合列之間的連接符,默認(rèn)為下劃線remove:是否刪除被組合的列wideunite<-unite(widedata, information, person, grade, score, sep= "-")wideunite
information1 Alex-2-782 Bob-3-893 Cathy-4-88
2.4 拆分:separate()separate()函數(shù)可將一列拆分為多列,一般可用于日志數(shù)據(jù)或日期時(shí)間型數(shù)據(jù)的拆分,語法如下: separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,convert = FALSE, extra = “warn”, fill = “warn”, …)data:為數(shù)據(jù)框col:需要被拆分的列into:新建的列名,為字符串向量sep:被拆分列的分隔符remove:是否刪除被分割的列
widesep <- separate(wideunite, information,c("person","grade","score"), sep = "-")widesep
person grade score1 Alex 2 782 Bob 3 893 Cathy 4 88
可見separate()函數(shù)和unite()函數(shù)的功能相反。
|