这篇实践是跟着猴子的教程走了一遍,为的是是熟悉项目目录和dplyr包的使用。
代码在我的git上:项目地址
项目的目录结构:
.Rproj.user
output
data
db
service
util
view
.Rhistory
da.Rproj
在git上传项目时发现一个问题,git跟踪的是文件,所以不会对空文件夹进行同步本地的项目中data,db等空文件夹没有传至服务器
项目结构:
db是数据层,用来获取/操作数据,service是业务逻辑层,view是视图层。项目建好之后只需要source()
运行视图层中的R脚本,即可运行整个项目,因为在view中同样使用source()
调用了service中的业务逻辑模块,而在service中调用数据操作模块(如果有的话)。
获取数据
nycflights13
包中的flights,是纽约2013年航班数据信息(On-time data for all flights that departed NYC (i.e. JFK, LGA or EWR) in 2013),共包含30多万条记录,19个变量涵盖了航班号,飞行时长,目的地,起飞时间,落地时间,延误时间。
str(flights)#On-time data for all flights that departed NYC (i.e. JFK, LGA or EWR) in 2013.
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 336776 obs. of 19 variables:
$ year : int 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
$ month : int 1 1 1 1 1 1 1 1 1 1 ...
$ day : int 1 1 1 1 1 1 1 1 1 1 ...
$ dep_time : int 517 533 542 544 554 554 555 557 557 558 ...
$ sched_dep_time: int 515 529 540 545 600 558 600 600 600 600 ...
$ dep_delay : num 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
$ arr_time : int 830 850 923 1004 812 740 913 709 838 753 ...
$ sched_arr_time: int 819 830 850 1022 837 728 854 723 846 745 ...
$ arr_delay : num 11 20 33 -18 -25 12 19 -14 -8 8 ...
$ carrier : chr "UA" "UA" "AA" "B6" ...
$ flight : int 1545 1714 1141 725 461 1696 507 5708 79 301 ...
$ tailnum : chr "N14228" "N24211" "N619AA" "N804JB" ...
$ origin : chr "EWR" "LGA" "JFK" "JFK" ...
$ dest : chr "IAH" "IAH" "MIA" "BQN" ...
$ air_time : num 227 227 160 183 116 150 158 53 140 138 ...
$ distance : num 1400 1416 1089 1576 762 ...
$ hour : num 5 5 5 5 6 5 6 6 6 6 ...
$ minute : num 15 29 40 45 0 58 0 0 0 0 ...
$ time_hour : POSIXct, format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...
service/flight.r中定义一个函数disDelay()该函数的目的是
- 获取数据
- 对数据进行操作,返回的数据框中应包含主要信息:延误时间和距离。
#引入包
library(dplyr)#数据操作
library(nycflights13)#包含数据
#定义函数
disDelay <- function(){
myFlights <- select(flights,year,month,day,dep_delay,arr_delay,distance,dest)
#由于本人对Mysql操作比较熟悉,将上面的命令改写为mysql的语言,便于自己理解
#SELECT year, month, day, dep_delay, arr_delay, distance, dest FROM flights
#重命名列remane函数
myFlights <- rename(myFlights, destination = dest)
#删除缺失值, 这里的空值代表航班取消。
myFlights <- filter(myFlights, !is.na(dep_delay), !is,na(arr_delay))
#表示留下的数据只包含没有缺失数据的记录
#对数据进行排序
myFlights <- arrange(myflithgs,desc(dep_delay))
#数据计算,起飞地都是纽约,所以如果目的地不同,表明距离不同, 根据目的地进行分组计算,距离和延误时间求均值
delay <- myFlights %>%
group_by(destination) %>%
summarise(
count = n(),
dist = mean(distance, na.rm=T),
delay = mean(arr_delay, na.rm=R)
) %>%
filter(count >20)
#SELECT destination, count(1) AS count,AVG(distance) AS dist,AVG(arr_delay) AS delay FROM myFlights GROUP BY destination WHERE count>20.
return(delay)
}
结果可视化
编写好service层之后,在view层中只需要source("service/flights.r")引入,进行结果展示。这里使用ggplot2包进行可视化。
library(ggplot2)
library(stringr)
source("service/flight.r")#相当于引入disDelay函数
delay <- disDelay()
view <- ggplot(data=delay) + #ggplot图层叠加
geom_point(mapping = aes(x=dist, y=delay)) +
geom_smooth(mapping = aes(x=dist, y=delay))
#保存为图片
filename <- str_r("output","delayFlight.jpg",sep="/")
ggsave(filename=filename,plot=view)
生成的结果:
![](https://img.haomeiwen.com/i6529705/8c1226c5d7373769.jpg)
用Mysql获取数据
刚才我们使用的是包自带的数据进行操作,大多数时候数据是存在于数据库中的,这就需要我们建立数据库链接,获取数据。git上的代码在这里。
#查询航班数据
findFlights <- function(){
#连接数据库
#user:数据库用户名,password:数据库密码,
#host数据库服务器地址(127.0.0.1是指本地数据库)
#dbname数据库名
con <- dbConnect(MySQL(),
user='root',
password='root',
port=3307,
host='127.0.0.1',
dbname='flightinfo')
#dbGetQuert执行一个sql语句
flightsdata <- dbGetQuery(con, "select year,month,day,
dep_delay,arr_delay,
distance,dest
from flights")
#关闭数据库连接
dbDisconnect(con)
return (flightsdata)
}
这时在service的文件中执行findFlights()
就可以获得航班数据了。
其他的代码不变,因为数据从30w条减少到1000条,生成的图像有些不同。
![](https://img.haomeiwen.com/i6529705/038cd1160cd07dc7.jpg)
网友评论