R4DS
wj
2019,2,2
library(tidyverse)library(nycflights13)library(forcats)library(lubridate)library(modelr)
实际上就是读取保存文件、数据库或web Api中的数据,再加载到R的数据框中。
就是将数据保存为一致的形式,以满足其所在数据集在语义上的要求。 简而言之,如果数据是整洁的,那么每列都是一个变量,每行都是一个观测值。
(3)转换(dplyr)
包括选取感兴趣的观测(如居住在某个城市里的所有人,或者去年的所有数据)、使用现有变量创建新变量、以及计算一些摘要统计量(如均值或计数) 数据整理和数据转化统称为数据处理。
本质上是人类活动。对数据提出新的问题。 ###(5)模型 如果将问题定义得足够清晰,那么你就可以使用一个模型来回答问题。 模型本质上是一种数学工具或计算工具。 每个模型都有前提假设,而且模型本身不会对自己的前提假设提出疑问。
数据分析可以分为两类:假设生成和假设验证(有时成为验证性分析)。 无需掩饰,本书的重点就在于假设生成,或者说是数据探索。 经常有人认为建模是用来进行假设验证的工具,而可视化是用来进行假设生成的工具。这种简单的二分法是错误的:模型经常用于数据探索;只需稍作处理,可视化也可以用来进行假设验证。核心区别在于你使用每个观测的频率:如果只用一次,那么就是假设验证;如果多于一次,那么就是数据探索。
geom_point() 散点图
facet_wrap() 单个变量分面
facet_grid() 多个变量分面
geom_smooth()直线图
geom_bar()条形图
geom_boxplot()箱线图
coord_flip()交换x轴和y轴
coord_polar()设置极坐标
color=class在mpg数据集中按照class进行描绘颜色
alpha=class
shape
linetype线段形状
se=FALSE平滑曲线上下无条状带
..prop..百分比
fill填充色
mpg
## # A
tibble: 234 x 11## manufacturer model displ year cyl trans drv cty hwy fl class## ## 1 audi a4 1.8 1999 4 auto~ f 18 29 p comp~## 2 audi a4 1.8 1999 4 manu~ f 21 29 p comp~## 3 audi a4 2 2008 4 manu~ f 20 31 p comp~## 4 audi a4 2 2008 4 auto~ f 21 30 p comp~## 5 audi a4 2.8 1999 6 auto~ f 16 26 p comp~## 6 audi a4 2.8 1999 6 manu~ f 18 26 p comp~## 7 audi a4 3.1 2008 6 auto~ f 18 27 p comp~## 8 audi a4 q~ 1.8 1999 4 manu~ 4 18 26 p comp~## 9 audi a4 q~ 1.8 1999 4 auto~ 4 16 25 p comp~## 10audi a4 q~ 2 2008 4 manu~ 4 20 28 p comp~## # ...
with 224 more rows
displ:引擎大小,单位为升。
hwy:汽车在高速公路上行驶时的燃油效率,单位为英里/加仑。
绘制mpg的图形,运行一下代码将displ放在x轴,hwy放在y轴。
ggplot(data=mpg)+ geom_point(mapping=aes(x=displ,y=hwy))
[if !vml]
[endif]
ggplot(data=)+ (mapping=aes())
图形属性是图中对象的可视化属性,其中包括数据点的大小、形状和颜色。
(1)颜色映射为class
ggplot(data=mpg)+ geom_point(mapping=aes(x=displ,y=hwy,color=class))
[if !vml]
[endif]
ggplot(data=mpg)+ geom_point(mapping=aes(x=displ,y=hwy))+ facet_wrap(~class,nrow=2)
[if !vml]
[endif]
ggplot(data=mpg)+ geom_smooth(mapping=aes(x=displ,y=hwy))
##
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
[if !vml]
[endif]
这种堆叠是由position参数设定的位置调整自动完成。如果不想生成堆叠式条形图,还可以使用一下3项之一:
position=identity
ggplot( data=diamonds, mapping=aes(x=cut,fill=clarity))+ geom_bar(alpha=1/5,position="identity")
[if !vml]
[endif]
ggplot( data=diamonds, mapping=aes(x=cut,color=clarity))+ geom_bar(fill=NA,position="identity")
[if !vml]
[endif]
position=“fill”的效果与堆叠相似,但每组堆叠条形具有同样高度,因此这种条形图可以非常轻松地比较各组间的比例:
ggplot(data=diamonds)+ geom_bar( mapping=aes(x=cut,fill=clarity), position="fill" )
[if !vml]
[endif]
position=“dodge”将每组的条形依次并列放置
ggplot(data=diamonds)+ geom_bar( mapping=aes(x=cut,fill=clarity), position="dodge" )
[if !vml]
[endif]
有些点会聚在一起,此时需要一个抖动,可以避免网格化排列。
ggplot(data=mpg)+ geom_point( mapping=aes(x=displ,y=hwy), position="jitter" )
[if !vml]
[endif]
极坐标coord_polar()
bar <- ggplot(data=diamonds)+ geom_bar( mapping=aes(x=cut,fill=cut), show.legend=FALSE, width=1 )+ theme(aspect.ratio=1)+ labs(x=NULL,y=NULL)bar+coord_flip()
[if !vml]
[endif]
bar+coord_flip()
[if !vml]
[endif]
ggplot(data=)+
(
mapping=aes(), stat=, position=
)+
+
你可以将任何图形精确第描述为数据集、几何对象、 映射集合、统计变换、位置调整、坐标系和分面模式 的一个组合
function_name(arg1=val1,arg2=val2,…)
seq()函数,可以生成规则的数值排列
x%in%y 选取出x是y中一个值时的所有行
is.na()判断是否为缺失值
year:day选择在year到day中的所有列
-(year:day)选择不在year到day之间的所有列(不包括“year”和“day”)
starts_with(“abc”):匹配以“abc”开头的名称。
ends_with(“xyz”)匹配以xyz结尾的名称
cotains(“ijk”)匹配包含ijk的名称
matches(“(.)\1”)选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有重复字符的变量。
num_range(“x”,1:3)匹配x1,x2和x3
na.rm=TRUE为除去缺失值(sum(AB,na.rm=TRUE))
常用摘要函数 mean(x)求x平均
median(x)求x的中位数
sd(x)均方误差(又称标准误差,standard
deviation,sd)是分散程度的标准度量方式。
IQR(x)四分位距
mad(x)绝对中位差
秩的度量
min(x)
quantile(x,0.25)找出x中按从小到大顺序大于前25%而小于75%的值
max(x)
first(x)=x[1]
nth(x,2)=x[2]
last(x)=x[length(x)]
sum(!is.na(x))计算非缺失值的数量
n_distinct(x)计算出唯一值的数量
wt=distance按照distance进行加权赋值
ALT+-:代码的快速输入
tab:选定需要的函数后再按一次Tab键,Rstudio可以自动添加括号()
ctrl+shift创建脚本
ctrl+enter运行该段代码
int整型
dbl双精度浮点数型变量,或称实数
chr表示字符向量,或称字符串
dttm表示日期时间(日期+时间)型变量
lgl逻辑型
fctr表示因子,R是用来表示具有固定数目的值的分类变量
date表示日期型变量
向量化,使用所谓的“循环法则”
%/%整数除法
%%求余
log()、log2()、log10()
lead()和lag()函数可以返回一个序列的领先值和滞后值
5个dplyr核心函数
filter()按值筛选观测(选择行,有逻辑表达式在后面)
arrange()对行进行重新排序
mutate()使用现有变量的函数创建新变量
summarize()将多个值总结为一个摘要统计量
select()选择列
cumsum()累加和
cumprod()累加积
commin()累加最小值
cummax()累加最大值
cummean()累加均值
filter()筛选行
filter(flights,month==1,day==1)
## # A
tibble: 842 x 19## year month day dep_time sched_dep_time dep_delayarr_time## ## 1 2013 1 1 517 515 2 830## 2 2013 1 1 533 529 4 850## 3 2013 1 1 542 540 2 923## 4 2013 1 1 544 545 -1 1004## 5 2013 1 1 554 600 -6 812## 6 2013 1 1 554 558 -4 740## 7 2013 1 1 555 600 -5 913## 8 2013 1 1 557 600 -3 709## 9 2013 1 1 557 600 -3 838## 10 2013 1 1 558 600 -2 753## # ...
with 832 more rows, and 12 more variables: sched_arr_time <int>,## # arr_delay , carrier ,flight , tailnum ,## # origin , dest ,air_time , distance , hour ,## # minute , time_hour
%in%
(nov_dec
<- filter(flights,month%in%c(11,12)))
## # A
tibble: 55,403 x 19## year month day dep_time sched_dep_time dep_delayarr_time## ## 1 2013 11 1 5 2359 6 352## 2 2013 11 1 35 2250 105 123## 3 2013 11 1 455 500 -5 641## 4 2013 11 1 539 545 -6 856## 5 2013 11 1 542 545 -3 831## 6 2013 11 1 549 600 -11 912## 7 2013 11 1 550 600 -10 705## 8 2013 11 1 554 600 -6 659## 9 2013 11 1 554 600 -6 826## 10 2013 11 1 554 600 -6 749## # ...
with 55,393 more rows, and 12 more variables: sched_arr_time <int>,## # arr_delay , carrier ,flight , tailnum ,## # origin , dest ,air_time , distance , hour ,## # minute , time_hour
filter()只能筛选出条件为TRUE的行;他会排除那些条件为FALSE和NA的行。
df <- tibble(x=c(1,NA,3))filter(df,x>1)
## # A
tibble: 1 x 1## x## ## 1 3
filter(df,is.na(x)|x>1)
## # A
tibble: 2 x 1## x## ## 1 NA## 2 3
arrange()排列行
arrange(flights,year,month,day)
## # A
tibble: 336,776 x 19## year month day dep_time sched_dep_time dep_delayarr_time## ## 1 2013 1 1 517 515 2 830## 2 2013 1 1 533 529 4 850## 3 2013 1 1 542 540 2 923## 4 2013 1 1 544 545 -1 1004## 5 2013 1 1 554 600 -6 812## 6 2013 1 1 554 558 -4 740## 7 2013 1 1 555 600 -5 913## 8 2013 1 1 557 600 -3 709## 9 2013 1 1 557 600 -3 838## 10 2013 1 1 558 600 -2 753## # ...
with 336,766 more rows, and 12 more variables: sched_arr_time <int>,## # arr_delay , carrier ,flight , tailnum ,## # origin , dest ,air_time , distance , hour ,## # minute , time_hour
注意: filter是默认升序排列
使用desc()可以按列进行降序排序:
arrange(flights,desc(arr_delay))
## # A
tibble: 336,776 x 19## year month day dep_time sched_dep_time dep_delayarr_time## ## 1 2013 1 9 641 900 1301 1242## 2 2013 6 15 1432 1935 1137 1607## 3 2013 1 10 1121 1635 1126 1239## 4 2013 9 20 1139 1845 1014 1457## 5 2013 7 22 845 1600 1005 1044## 6 2013 4 10 1100 1900 960 1342## 7 2013 3 17 2321 810 911 135## 8 2013 7 22 2257 759 898 121## 9 2013 12 5 756 1700 896 1058## 10 2013 5 3 1133 2055 878 1250## # ...
with 336,766 more rows, and 12 more variables: sched_arr_time <int>,## # arr_delay , carrier ,flight , tailnum ,## # origin , dest ,air_time , distance , hour ,## # minute , time_hour
缺失值总是排在最后
df <- tibble(x=c(5,2,NA))arrange(df,x)
## # A
tibble: 3 x 1## x## ## 1 2## 2 5## 3 NA
arrange(df,desc(x))
## # A
tibble: 3 x 1## x## ## 1 5## 2 2## 3 NA
使用select()选择列
select(flights,year,month,day)
## # A
tibble: 336,776 x 3## year month day## ## 1 2013 1 1## 2 2013 1 1## 3 2013 1 1## 4 2013 1 1## 5 2013 1 1## 6 2013 1 1## 7 2013 1 1## 8 2013 1 1## 9 2013 1 1## 10 2013 1 1## # ...
with 336,766 more rows
select(flights,year:day)
## # A
tibble: 336,776 x 3## year month day## ## 1 2013 1 1## 2 2013 1 1## 3 2013 1 1## 4 2013 1 1## 5 2013 1 1## 6 2013 1 1## 7 2013 1 1## 8 2013 1 1## 9 2013 1 1## 10 2013 1 1## # ...
with 336,766 more rows
选择不再year到day之间的所有列(不包括year和day)
select(flights,-(year:day))
## # A
tibble: 336,776 x 16## dep_time sched_dep_time dep_delay arr_timesched_arr_time arr_delay## ## 1 517 515 2 830 819 11## 2 533 529 4 850 830 20## 3 542 540 2 923 850 33## 4 544 545 -1 1004 1022 -18## 5 554 600 -6 812 837 -25## 6 554 558 -4 740 728 12## 7 555 600 -5 913 854 19## 8 557 600 -3 709 723 -14## 9 557 600 -3 838 846 -8## 10 558 600 -2 753 745 8## # ...
with 336,766 more rows, and 10 more variables: carrier <chr>,## # flight , tailnum ,origin , dest , air_time ,## # distance , hour ,minute , time_hour
将几个变量移到数据框开头
select(flights,time_hour,air_time,everything())
## # A
tibble: 336,776 x 19## time_hour air_time year month day dep_time sched_dep_time## ## 1 2013-01-01 05:00:00 227 2013 1 1 517 515## 2 2013-01-01 05:00:00 227 2013 1 1 533 529## 3 2013-01-01 05:00:00 160 2013 1 1 542 540## 4 2013-01-01 05:00:00 183 2013 1 1 544 545## 5 2013-01-01 06:00:00 116 2013 1 1 554 600## 6 2013-01-01 05:00:00 150 2013 1 1 554 558## 7 2013-01-01 06:00:00 158 2013 1 1 555 600## 8 2013-01-01 06:00:00 53 2013 1 1 557 600## 9 2013-01-01 06:00:00 140 2013 1 1 557 600## 102013-01-01 06:00:00 138 2013 1 1 558 600## # ...
with 336,766 more rows, and 12 more variables: dep_delay <dbl>,## # arr_time , sched_arr_time, arr_delay , carrier ,## # flight , tailnum ,origin , dest , distance ,## # hour , minute
使用mutate()添加新变量
flights_sml
<- select(flights, year:day, ends_with("delay"), distance, air_time )mutate(flights_sml, gain=arr_delay-dep_delay, speed=distance/air_time*60 )
## # A
tibble: 336,776 x 9## year month day dep_delay arr_delay distanceair_time gain speed## ## 1 2013 1 1 2 11 1400 227 9 370.## 2 2013 1 1 4 20 1416 227 16 374.## 3 2013 1 1 2 33 1089 160 31 408.## 4 2013 1 1 -1 -18 1576 183 -17 517.## 5 2013 1 1 -6 -25 762 116 -19 394.## 6 2013 1 1 -4 12 719 150 16 288.## 7 2013 1 1 -5 19 1065 158 24 404.## 8 2013 1 1 -3 -14 229 53 -11 259.## 9 2013 1 1 -3 -8 944 140 -5 405.## 10 2013 1 1 -2 8 733 138 10 319.## # ...
with 336,766 more rows
一旦创建,新列就可以立即使用:
mutate(flights_sml, gain=arr_delay-dep_delay, hours=air_time/60, gain_per_hour=gain/hours )
## # A
tibble: 336,776 x 10## year month day dep_delay arr_delay distanceair_time gain hours## ## 1 2013 1 1 2 11 1400 227 9 3.78## 2 2013 1 1 4 20 1416 227 16 3.78## 3 2013 1 1 2 33 1089 160 31 2.67## 4 2013 1 1 -1 -18 1576 183 -17 3.05## 5 2013 1 1 -6 -25 762 116 -19 1.93## 6 2013 1 1 -4 12 719 150 16 2.5 ## 7 2013 1 1 -5 19 1065 158 24 2.63## 8 2013 1 1 -3 -14 229 53 -11 0.883## 9 2013 1 1 -3 -8 944 140 -5 2.33## 10 2013 1 1 -2 8 733 138 10 2.3 ## # ...
with 336,766 more rows, and 1 more variable: gain_per_hour <dbl>
如果只想保留新变量,可以使用transmute()函数
transmute(flights, gain=arr_delay-dep_delay, hours=air_time/60, gain_per_hour=gain/hours)
## # A
tibble: 336,776 x 3## gain hours gain_per_hour## ## 1 93.78 2.38## 2 163.78 4.23## 3 312.67 11.6## 4 -173.05 -5.57## 5 -191.93 -9.83## 6 162.5 6.4## 7 242.63 9.11## 8 -110.883 -12.5## 9 -52.33 -2.14## 10 10 2.3 4.35## # ...
with 336,766 more rows
lead()和lag()函数可以返回一个序列的领先值和滞后值
(x <- 1:10)
## [1] 1 2 3 4 5 6 7 8 9 10
lag(x)
## [1] NA 1 2 3 4 5 6 7 8 9
lead(x)
## [1] 2 3 4 5 6 7 8 9 10NA
使用summarize()进行分组摘要 可以将数据框折叠成一行:
summarize(flights,delay=mean(dep_delay,na.rm=TRUE))
## # A
tibble: 1 x 1## delay## ## 1 12.6
group_by()可以将分析单位从整个数据集更改为单个分组。接下来,在 分组后的数据框中使用dplyr函数时,会自动地应用到每个分组。
by_day = group_by(flights,year,month,day)summarize(by_day,delay=mean(dep_delay,na.rm=TRUE))
## # A
tibble: 365 x 4## #Groups: year, month [?]## year month day delay## ## 1 2013 1 1 11.5## 2 2013 1 2 13.9## 3 2013 1 3 11.0## 4 2013 1 4 8.95## 5 2013 1 5 5.73## 6 2013 1 6 7.15## 7 2013 1 7 5.42## 8 2013 1 8 2.55## 9 2013 1 9 2.28## 10 2013 1 10 2.84## # ...
with 355 more rows
%>%管道最好读作“然后”
x%>%f(y)会转换为f(x,y)
x%>%f(y)%>%g(z)会转换为g(f(x,y),z)
flights%>% group_by(year,month,day)%>% summarize(mean=mean(dep_delay))
## # A
tibble: 365 x 4## #Groups: year, month [?]## year month day mean## ## 1 2013 1 1 NA## 2 2013 1 2 NA## 3 2013 1 3 NA## 4 2013 1 4 NA## 5 2013 1 5 NA## 6 2013 1 6 NA## 7 2013 1 7 NA## 8 2013 1 8 NA## 9 2013 1 9 NA## 10 2013 1 10 NA## # ...
with 355 more rows
这样会得到很多缺失值,这是因为聚合函数遵循缺失值的一般规则:如果输入中有确实值,那么输出也会是缺失值。
flights%>% group_by(year,month,day)%>% summarize(mean=mean(dep_delay,na.rm = TRUE))
## # A tibble:
365 x 4## #Groups: year, month [?]## year month day mean## ## 1 2013 1 1 11.5## 2 2013 1 2 13.9## 3 2013 1 3 11.0## 4 2013 1 4 8.95## 5 2013 1 5 5.73## 6 2013 1 6 7.15## 7 2013 1 7 5.42## 8 2013 1 8 2.55## 9 2013 1 9 2.28## 10 2013 1 10 2.84## # ...
with 355 more rows
缺失值表示取消的航班,我们也可以通过先去除取消的航班来解决缺失值问题。
not_cancelled
<- flights%>% filter(!is.na(dep_delay),!is.na(arr_delay))#关键一步not_cancelled%>% group_by(year,month,day)%>% summarize(mean=mean(dep_delay))
## # A
tibble: 365 x 4## #Groups: year, month [?]## year month day mean## ## 1 2013 1 1 11.4## 2 2013 1 2 13.7## 3 2013 1 3 10.9## 4 2013 1 4 8.97## 5 2013 1 5 5.73## 6 2013 1 6 7.15## 7 2013 1 7 5.42## 8 2013 1 8 2.56## 9 2013 1 9 2.30## 10 2013 1 10 2.84## # ...
with 355 more rows
位置度量
not_cancelled%>% group_by(year,month,day)%>% summarize( avg_delay1=mean(arr_delay), avg_delay2=mean(arr_delay[arr_delay>0])#[arr_delay>0]为arr_delay向量中变量中的arr_delay大于0的元素。 )
## # A
tibble: 365 x 5## #Groups: year, month [?]## year month day avg_delay1 avg_delay2## ## 1 2013 1 1 12.7 32.5## 2 2013 1 2 12.7 32.0## 3 2013 1 3 5.73 27.7## 4 2013 1 4 -1.93 28.3## 5 2013 1 5 -1.53 22.6## 6 2013 1 6 4.24 24.4## 7 2013 1 7 -4.95 27.8## 8 2013 1 8 -3.23 20.8## 9 2013 1 9 -0.264 25.6## 10 2013 1 10 -5.90 27.3## # ...
with 355 more rows
not_cancelled%>% count(tailnum,wt=distance)
## # A
tibble: 4,037 x 2## tailnum n## ## 1 D942DN 3418## 2 N0EGMQ 239143## 3 N10156 109664## 4 N102UW 25722## 5 N103US 24619## 6 N104UW 24616## 7 N10575 139903## 8 N105UW 23618## 9 N107US 21677## 10N108UW 32070## # ...
with 4,027 more rows
逻辑计数和比例
sum(x>10)
true=1,false=0
not_cancelled%>% group_by(year,month,day)%>% summarize(n_early=sum(dep_time<500))
## # A
tibble: 365 x 4## #Groups: year, month [?]## year month day n_early## ## 1 2013 1 1 0## 2 2013 1 2 3## 3 2013 1 3 4## 4 2013 1 4 3## 5 2013 1 5 3## 6 2013 1 6 2## 7 2013 1 7 2## 8 2013 1 8 1## 9 2013 1 9 3## 10 2013 1 10 3## # ...
with 355 more rows
如何使用可视化和数据转换来系统化地探索数据,统计学家将这项任务称为探索性数据分析(EDA)。EDA是一个可迭代的循环过程。
EDA工具:可视化,数据转换和建模。