R语言学习笔记总结
R语言初步-用dplyr进行数据转换
install.packages("tidyverse")
install.packages("nycflights13")#仍然记得要先安装
library(nycflights13)#航班信息文件
library(tidyverse)
?flights#查看数据信息的说明书
flights#查看航班信息
4.使用summarize()函数进行分组摘要
计算所有的dep_delay延误时间平均值
summarize(flights,
delay=mean(dep_delay,na.rm=TRUE)
) #计算了dep_delay列的平均值
#运行:
# A tibble: 1 x 1
delay
<dbl>
1 12.6
和 group_by() 函数合用可以实现更多功能:
4.1计算每天的平均延误时间
by_day <- group_by(flights,year,month,day) #按照年月日分组
summarise(by_day,delay=mean(dep_delay,na.rm=TRUE)) #调用按day分的组,计算平均值
#运行:
`summarise()` has grouped output by 'year', 'month'. You can override using the `.groups`
argument.
# A tibble: 365 x 4
# Groups: year, month [12]
year month day delay
<int> <int> <int> <dbl>
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
4.2研究目的地距离和平均延误之间的关系
by_dest <- group_by(flights,dest) #按照目的地分组
delay1 <- summarise(by_dest,
count=n(), #生成一个计数列
dist=mean(distance,na.rm=TRUE),
delay=mean(arr_delay,na.rm=TRUE),
) #计算距离均值和延误时间均值
delay1 #查看表内容
#运行:
# A tibble: 105 x 4
dest count dist delay
<chr> <int> <dbl> <dbl>
1 ABQ 254 1826 4.38
2 ACK 265 199 4.85
3 ALB 439 143 14.4
4 ANC 8 3370 -2.5
5 ATL 17215 757. 11.3
6 AUS 2439 1514. 6.02
7 AVL 275 584. 8.00
8 BDL 443 116 7.05
9 BGR 375 378 8.03
10 BHM 297 866. 16.9
# ... with 95 more rows
#运用以上的表进行
ggplot(data=delay1,
mapping=aes(x=dist,y=delay))+
geom_point(aes(size=count),alpha=1/3)+
geom_smooth(se=FALSE)
#运用散点图和曲线图将数据展现出来生成图片delay1。
接着按自己的设置调整数据,例如:
delay2 <- filter(delay,count>20,dest!="HNL") #删选出计数大于20而且目的地不是HNL的航班
delay2 #查看数据
#运行:
# A tibble: 96 x 4
dest count dist delay
<chr> <int> <dbl> <dbl>
1 ABQ 254 1826 4.38
2 ACK 265 199 4.85
3 ALB 439 143 14.4
4 ATL 17215 757. 11.3
5 AUS 2439 1514. 6.02
6 AVL 275 584. 8.00
7 BDL 443 116 7.05
8 BGR 375 378 8.03
9 BHM 297 866. 16.9
10 BNA 6333 758. 11.8
# ... with 86 more rows
ggplot(data=delay2,
mapping=aes(x=dist,y=delay))+
geom_point(aes(size=count),alpha=1/3)+
geom_smooth(se=FALSE)
#运用散点图和曲线图将数据展现出来生成图片delay2
4.3使用管道组合操作
使用管道操作简化上述代码:
使用 %>% ,可以理解为“然后”,用它可以省去重复的命名过程。
delay3 <-
flights %>%
group_by(dest) %>%
summarise(
count=n(),
dist=mean(distance,na.rm=TRUE),
delay=mean(arr_delay,na.rm=TRUE)
) %>%
filter(count>20,dest!="HNL")
delay3
ggplot(data=delay3,mapping=aes(x=dist,y=delay))+
geom_point(aes(size=count),alpha=1/3)+
geom_smooth(se=FALSE)
#生成和delay2相同的delay3
使用 %>% ,x %>% f(y)会变成f(x,y),可以理解为下面的函数指定了一个自变量,下面的命令语句如同一个通路管道,让x自由流淌,嗯哼,舒适了。
注意ggplot2是不支持管道操作的。
4.4关于缺失值和参数na.rm的使用
上述代码中na.rm删去会如何?它有什么作用?
flights %>%
group_by(year,month,day) %>%
summarise(mean(dep_delay)) #na.rm删去
#运行:
# A tibble: 365 x 4
# Groups: year, month [12]
year month day `mean(dep_delay)`
<int> <int> <int> <dbl>
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
上述生成的表中有很多缺失值,因为summarise()函数遵循缺失值的一般规则,输入中有缺失值那么输出的也是NA。比如我们使用的数据表中有很多取消的航班,所以mean(dep_delay)的计算结果也成了NA。
在这种情况下,加上na.rm=TRUE语句可以自动去除缺失值。
flights %>%
group_by(year,month,day) %>%
summarise(mean(dep_delay,na.rm=TRUE))
#运行:
# A tibble: 365 x 4
# Groups: year, month [12]
year month day `mean(dep_delay, na.rm = TRUE)`
<int> <int> <int> <dbl>
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
也可以自己手动用filter()函数删去缺失值:
Not_cancelled <- flights %>%
filter(!is.na(dep_delay),!is.na(arr_delay))
Not_cancelled %>%
group_by(year,month,day) %>%
summarise(mean=mean(dep_delay))
#运行:
# A tibble: 365 x 4
# Groups: year, month [12]
year month day mean
<int> <int> <int> <dbl>
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
4.5学会使用计数
通过计数功能可以查看自己所得的数据到底是通过多少组数据得来的:
计数:n()
非缺失值计数:sum(!is.na())
举例:运用机尾编号查看平均延误时长最长的飞机:
delays <- Not_cancelled %>%
group_by(tailnum)%>%
summarise(delay=mean(arr_delay)
)
ggplot(data=delays,mapping=aes(x=delay))+
geom_freqpoly(binwidth=10)
可以用散点图,更直观:
delays <- Not_cancelled %>%
group_by(tailnum)%>%
summarise(
delay=mean(arr_delay,na.rm=TRUE),
n=n()
)
ggplot(data=delays,mapping=aes(x=n,y=delay))+
geom_point(alpha=1/10)
#生成散点图,横轴是n,代表个数
在上述图形中,少数数据给图形带来了很明显的特征。有时我们需要去掉观测数量少的分组:
delays <- Not_cancelled %>%
group_by(tailnum)%>%
summarise(
delay=mean(arr_delay,na.rm=TRUE),
n=n()
)
delays %>%
filter(n>25)%>%
ggplot(mapping=aes(x=n,y=delay))+
geom_point(alpha=1/10)
#生成经过筛选后的散点图