R数据科学(dplyr)
如今数据分析如火如荼,R
与Python
大行其道。你还在用Excel整理数据么,你还在用spss整理数据么。
数据分析的基础:Data Clean
数据清洗是数据处理的必备工作,而且往往需要花费大量时间去整理,去提取想要的数据,因为画图,报表都需要特定格式的数据。
EXCEL缺点:
- 数据粘贴复制,导致存在很多副本,更改都不知道原来数据有没有被改动
- 数据排序,计算,鼠标点击,容易误操作。
- 忘记保存,白费时间
- 效率低,时间长
现在,我们将学习对处理数据有用的两个软件包:
- dplyr是用于简化表格数据操作的软件包。
- tidyr使您可以在不同的数据格式之间快速转换。
两个软件包中的命令都可以与管道函数(%>%
)很好地配合使用,这可以使代码更具可读性。详细内容可参考Cheatsheet手册。
1.数据框格式(DataFrame
)
一般,我们的excel包括行(col
)与列(row
),在R语言中,经常对excel操作的对象称之为Dataframe
,那么在进行数据查看时候,R语言可以看到数据结构。但是往往会打印出来很长,tidyr
中的tibble
就解决了此问题,直接简单的看到数据结构及变量类型。
class(mtcars)
可以查看数据的类型,为"data.frame";mtcars
就可以看到全部的数据了。但是如果数据太多,那么就很不方便。
head(mtcars)
,可以看到数据的前面6行,属于数据的一个预览。但是看不到各个列的属性。
%>%
管道函数,其实就是将f()
写在了数据的后面,下面示例的两个操作,都得到df,效果一样。只不过 %>%
看起来更简单,将mtcars
赋予新的tibble
。
df以后的输出,很简洁,能看到32
*11
的数据行与列,也能看到各列的属性。一目了然
#### 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.数据-变量提取及产生
我们经常会用到,只需要里面的几个变量,不是所有的变量都输出。那么就涉及到变量的提取。就会用到select
函数,可以提取需要的变量。有一个好处就是,不修改原是数据。
那如果新产生一个变量mpg1=mpg
,或者new=mpg*cyl
,就用到mutate
函数,产生新变量。
# 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.数据-变量条件筛选
dplyr::filter()函数对上述新产生的变量的数据df,进行筛选。只要符合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.数据分组计算
有时候,需要分组计算均值标准差,或者看gear
不同水平下的最大值最小值,那么就用到group_by()
与 summarise()
函数。
譬如,对不同gear计算mpg的均值及标准差。或者根据am及gear分组计算mpg均值标注差。
# 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.数据转换
有时候,处理数据时候,需要对变量类型进行转换,譬如字符串,因子及数值类型相互转换,上述数据里面dbl 意思是数值类型(double class)
我们现在产生新的字符串chr
及因子fct
。使用mutate
函数。可以看到mpg1与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()
有时候,会需要将连续性的变量,转换成分类变量。这时候就需要用到ifelse
函数(转换成二分类变量),或者cut
函数转换成多类别变量。代码如下
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
未完待续。。。
下一期介绍,如何转变行列及合并两个数据集。
具体详细内容,可前往Data Transformation with dplyr : : CHEAT SHEET