R數(shù)據(jù)科學(xué)(dplyr)
如今數(shù)據(jù)分析如火如荼,R與Python大行其道。你還在用Excel整理數(shù)據(jù)么,你還在用spss整理數(shù)據(jù)么。
數(shù)據(jù)分析的基礎(chǔ):Data Clean
數(shù)據(jù)清洗是數(shù)據(jù)處理的必備工作,而且往往需要花費大量時間去整理,去提取想要的數(shù)據(jù),因為畫圖,報表都需要特定格式的數(shù)據(jù)。
EXCEL缺點:
- 數(shù)據(jù)粘貼復(fù)制,導(dǎo)致存在很多副本,更改都不知道原來數(shù)據(jù)有沒有被改動
- 數(shù)據(jù)排序,計算,鼠標(biāo)點擊,容易誤操作。
- 忘記保存,白費時間
- 效率低,時間長
現(xiàn)在,我們將學(xué)習(xí)對處理數(shù)據(jù)有用的兩個軟件包:
- dplyr是用于簡化表格數(shù)據(jù)操作的軟件包。
- tidyr使您可以在不同的數(shù)據(jù)格式之間快速轉(zhuǎn)換。
兩個軟件包中的命令都可以與管道函數(shù)(%>%)很好地配合使用,這可以使代碼更具可讀性。詳細(xì)內(nèi)容可參考Cheatsheet手冊。


1.數(shù)據(jù)框格式(DataFrame)
一般,我們的excel包括行(col)與列(row),在R語言中,經(jīng)常對excel操作的對象稱之為Dataframe,那么在進(jìn)行數(shù)據(jù)查看時候,R語言可以看到數(shù)據(jù)結(jié)構(gòu)。但是往往會打印出來很長,tidyr中的tibble就解決了此問題,直接簡單的看到數(shù)據(jù)結(jié)構(gòu)及變量類型。
class(mtcars)可以查看數(shù)據(jù)的類型,為"data.frame";mtcars就可以看到全部的數(shù)據(jù)了。但是如果數(shù)據(jù)太多,那么就很不方便。
head(mtcars),可以看到數(shù)據(jù)的前面6行,屬于數(shù)據(jù)的一個預(yù)覽。但是看不到各個列的屬性。
%>%管道函數(shù),其實就是將f()寫在了數(shù)據(jù)的后面,下面示例的兩個操作,都得到df,效果一樣。只不過 %>%看起來更簡單,將mtcars賦予新的tibble。
df以后的輸出,很簡潔,能看到32*11的數(shù)據(jù)行與列,也能看到各列的屬性。一目了然
#### Install packages --------------
install.packages(c("tidyverse"), dependencies = TRUE)
library(dplyr)
library(tidyr)
> class(mtcars)
[1] "data.frame"
> mtcars
> 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
>
> df= mtcars %>% tibble()
> df
# 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 21 6 160 110 3.9 2.62 16.5 0 1 4 4
2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# … with 22 more rows
> df=tibble(mtcars)
> df
2.數(shù)據(jù)-變量提取及產(chǎn)生
我們經(jīng)常會用到,只需要里面的幾個變量,不是所有的變量都輸出。那么就涉及到變量的提取。就會用到select函數(shù),可以提取需要的變量。有一個好處就是,不修改原是數(shù)據(jù)。
那如果新產(chǎn)生一個變量mpg1=mpg,或者new=mpg*cyl,就用到mutate函數(shù),產(chǎn)生新變量。
# select
mtcars %>% as.tbl() %>%
dplyr::select(mpg,cyl,am,gear)
# mutate
mtcars %>% as.tbl() %>%
dplyr::select(mpg,cyl,am,gear) %>%
mutate(mpg1=mpg,
new=mpg*cyl)
# A tibble: 32 x 6
mpg cyl am gear mpg1 new
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21 6 1 4 21 126
2 21 6 1 4 21 126
3 22.8 4 1 4 22.8 91.2
4 21.4 6 0 3 21.4 128.
5 18.7 8 0 3 18.7 150.
6 18.1 6 0 3 18.1 109.
7 14.3 8 0 3 14.3 114.
8 24.4 4 0 4 24.4 97.6
9 22.8 4 0 4 22.8 91.2
10 19.2 6 0 4 19.2 115.
# … with 22 more rows
3.數(shù)據(jù)-變量條件篩選
dplyr::filter()函數(shù)對上述新產(chǎn)生的變量的數(shù)據(jù)df,進(jìn)行篩選。只要符合am=1給提取出來,或者對符合am=1,gear=4條件的輸出。
# filter
df = mtcars %>% as.tbl() %>%
dplyr::select(mpg,cyl,am,gear) %>%
mutate(mpg1=mpg,
new=mpg*cyl)
df %>% dplyr::filter(am==1)
df %>% dplyr::filter(am==1 & gear==4)
5.數(shù)據(jù)分組計算
有時候,需要分組計算均值標(biāo)準(zhǔn)差,或者看gear不同水平下的最大值最小值,那么就用到group_by()與 summarise() 函數(shù)。
譬如,對不同gear計算mpg的均值及標(biāo)準(zhǔn)差?;蛘吒鶕?jù)am及gear分組計算mpg均值標(biāo)注差。
# group by gear
df %>%
group_by(gear) %>%
summarise(mean=mean(mpg),
sd=sd(mpg))
# A tibble: 3 x 3
gear mean sd
<dbl> <dbl> <dbl>
1 3 16.1 3.37
2 4 24.5 5.28
3 5 21.4 6.66
# gear +am
df %>%
group_by(gear,am) %>%
summarise(mean=mean(mpg),
sd=sd(mpg))
# A tibble: 4 x 4
# Groups: gear [3]
gear am mean sd
<dbl> <dbl> <dbl> <dbl>
1 3 0 16.1 3.37
2 4 0 21.0 3.07
3 4 1 26.3 5.41
4 5 1 21.4 6.66
6.數(shù)據(jù)轉(zhuǎn)換
有時候,處理數(shù)據(jù)時候,需要對變量類型進(jìn)行轉(zhuǎn)換,譬如字符串,因子及數(shù)值類型相互轉(zhuǎn)換,上述數(shù)據(jù)里面dbl 意思是數(shù)值類型(double class)我們現(xiàn)在產(chǎn)生新的字符串chr及因子fct。使用mutate函數(shù)??梢钥吹絤pg1與new都變成了chr與fct。
提取new,看一下。
# transfer
df = mtcars %>% as.tbl() %>%
dplyr::select(mpg,cyl,am,gear) %>%
mutate(mpg1=as.character(mpg),
new=factor(am))
df
# A tibble: 32 x 6
mpg cyl am gear mpg1 new
<dbl> <dbl> <dbl> <dbl> <chr> <fct>
1 21 6 1 4 21 1
2 21 6 1 4 21 1
3 22.8 4 1 4 22.8 1
4 21.4 6 0 3 21.4 0
5 18.7 8 0 3 18.7 0
6 18.1 6 0 3 18.1 0
7 14.3 8 0 3 14.3 0
8 24.4 4 0 4 24.4 0
9 22.8 4 0 4 22.8 0
10 19.2 6 0 4 19.2 0
# … with 22 more rows
summary(df)
df %>% dplyr::select(new) %>% pull()
有時候,會需要將連續(xù)性的變量,轉(zhuǎn)換成分類變量。這時候就需要用到ifelse函數(shù)(轉(zhuǎn)換成二分類變量),或者cut函數(shù)轉(zhuǎn)換成多類別變量。代碼如下
df = mtcars %>% as.tbl() %>%
dplyr::select(mpg,cyl,am,gear) %>%
mutate(mpg1=ifelse(mpg<25,"yes","no"),
mpg2=factor(mpg1),
mpg3=cut_number(mpg, n = 4),
mpg4=cut(mpg,breaks=c(-Inf,20,40,Inf),labels=c("low","middle","high"))
)
df
未完待續(xù)。。。
下一期介紹,如何轉(zhuǎn)變行列及合并兩個數(shù)據(jù)集。
具體詳細(xì)內(nèi)容,可前往Data Transformation with dplyr : : CHEAT SHEET