請用正確的姿勢維護新手的熱情和自信----學慣用R操作資料庫MySQL以及項目模塊化的應用
1、用R操作資料庫
可以單獨使用MySQL進行數據分析,也可以將R和MySQL結合起來使用。
RMySQL包提供了R中操作MySQL的各種方法。
基本需要4步就可完成:1)導入RMySQL包;
2)連接資料庫;
3)SQL查詢:獲取數據;
4)關閉資料庫連接。
接下來依次詳細講解每一步。
1) 導入RMySQL包
在Rstudio中安裝RMySQL包
Install.packages(「RMySQL」)
再導入該包
Library(RMySQL)
當安裝該包的時候,出現「InternetOpenUrlfailed」錯誤。心頭一緊,
先在Google上搜索「Warning in install.packages : InternetOpenUrl failed:」看看吧,
對該問題作者提供了三個解決辦法,有點不明所以。緊接著下面,看到有回復提到感謝作者,好像最後一個選擇解決了問題。」did the trick」是啥意思呢?一查有「達到目的」、「將困難工作做好」的意思。
添加該語句後果然成功安裝,感覺挺爽的。解決問題的同時學到了一句地道的did the trick。
2) 連接資料庫
語句如下:
con <-dbConnect(MySQL(),
host="127.0.0.1",
user="root",
password="######",
dbname="world")
其中,host是資料庫伺服器地址(上述127.0.0.1是指本地資料庫);user和password 分別是登陸資料庫的用戶名和密碼(你的密碼可不是"######"哦,請正確輸入);dbname是資料庫名稱,這裡鏈接了mysql中的world資料庫。
3) SQL查詢:獲取數據
連接好資料庫就可以從資料庫中查詢數據了,接下來使用RMySQL包中的dbGetQuery函數來查詢數據。
city <-dbGetQuery(con, "select * from city")
其中,傳入的第1個參數con 就是剛才建立資料庫的連接變數,第2個參數就是一條SQL語句。
具體結果如下:
執行該語句後,可看到查詢結果保存在數據框(Data)中,點擊Data中的city可以查看到其中的數據。
4) 關閉資料庫連接
資料庫使用完後,需要關閉資料庫連接。
dbDisconnect(con)
上述過程的完整代碼如下:
options(download.file.method="libcurl")
install.packages("RMySQL")
library(RMySQL)
con <- dbConnect(MySQL(),
host="127.0.0.1",
user="root",
password="mydarling050627",
dbname="world")
city <- dbGetQuery(con, "select *from city")
dbDisconnect(con)
2、實踐案例及項目模塊建立
明白了R中操作資料庫獲取數據後,在接下來完整項目的案例再次應用,並結合之前學過的零散內容,通過項目模塊的方式,建立一個數據獲取、數據分析和數據展示的完整項目流程。
在上一節分析過一個航班飛行距離與延時的案例,而該案例的數據來源於數據包,但現實中更多的數據來源於資料庫。
2.1) 導入資料庫數據
在沒有資料庫的情況下,需要先建立資料庫。
1) 建立資料庫,在MySQLWorkbench中按下圖建立資料庫flightsinfo用於存放航班數據。
2) 在MySQLWorkbench中按下圖操作即可導入將航班數據導入本地資料庫中
3) 航班數據導入MySQL中,並能看到表flights,如下圖所示:
2.2) 重構項目代碼
數據準備好後,需要重構航班飛行距離與延時分析案例的項目代碼。
1) util文件夾加入安裝包管理代碼文件packageManage.R
打開util 文件夾中的packageMange.R,在該R腳本中的最上面添加如下代碼:
packages <- c("RMySQL")
if (length(setdiff(packages,rownames(installed.packages()))) > 0) {
install.packages(setdiff(packages, rownames(installed.packages())))
}
此段代碼的目的是,每次項目運行時都會判斷RMySQL是否安裝過;如果安裝過,則不會重新安裝該包;如果沒安裝,則會安裝該包。
同理,管理安裝包的文件需要判斷項目需要的其他安裝包。如下:
2) 數據層模塊(db)加入代碼文件db.R
模塊db(文件夾)中主要用於存放資料庫操作相關的功能,在db文件夾下新建db.R腳本。
上述代碼主要是從航班資料庫(flightsinfo)中查詢航班表(flights)到R中,與文章第1部分用R操作資料庫方法相同。只是為了方便其他模塊調用該功能,將資料庫查詢代碼封裝到方法findFlighs中。
2.3)業務邏輯模塊(service) 內flight.R文件代碼的修改
之前數據是從包中獲取的,代碼如下:
install.packages("dplyr")
library(dplyr)
#for data
install.packages("nycflights13")
library(nycflights13)
flights
修改後的代碼如下:
library(dplyr)
#路徑不是getwd(),一時不清楚怎麼用函數得到,就直接輸入路徑了
projectPath <-"E:/R/0521practice"
#db.R路徑
dbPath <- str_c(projectPath,
"db",
"db.R",
sep = "/")
#編譯db.R文件
source(dbPath)
#獲取數據
myFlights <- findFlights()
代碼解釋:1)需要將db模塊中的db.R引入數據,用於service模塊中的flight.R航班數據分析。此時數據包nycflights13就不需要了,因此刪除掉。2)引入db.R後,就可以在flight.R中使用db.R的方法獲取航班數據了。3)將業務邏輯部分繼續封裝到新的方法disDelay中,便於後續view模塊中的文件使用。
flight.R完整代碼如下圖所示:
2.4 視圖模塊(view)中建立文件flightView.R
代碼如下:
library(ggplot2)
library(stringr)
#路徑指向業務邏輯模塊下的文件flight.R
projectPath <-"E:/R/0521practice"
servicePath <- str_c(projectPath,
"service",
"flight.R",
sep = "/")
source(servicePath)
#調用flight.R中的disDelay方法
delay <- disDelay()
#繪圖語句
view <- ggplot(data = delay) +
geom_point(mapping = aes(x = dist, y = delay)) +
geom_smooth(mapping = aes(x = dist, y = delay))
#建立輸出路徑結果保存
outputpath <-str_c(projectPath,"output","delayFlight.jpg",sep ="/")
ggsave(filename = outputpath, plot = view)
代碼解釋:順序與業務邏輯模塊相同。在導入需求包(如ggplot2、stringr)的前提下,建立業務邏輯模塊(如service)下的路徑並編譯相關文件(如servicePath),然後便可直接調用該部分的方法(如disDelay)。再繼續寫入該模塊下的代碼(如上述繪圖語句),最後建立輸出路徑並保存結果。
2.5)運行代碼
如下圖所示:先點開view模塊下的flightView.R文件,然後點擊Source運行代碼。
運行後可在output模塊下看到delayFlight.jpg圖片。如下所示:
至此,學習了一個數據獲取、數據分析和數據展示的完整項目流程。
學習總結:
1、熟悉並學習了用R操作資料庫的步驟,如導入RMySQL包、連接資料庫、用SQL語句獲取數據、斷開資料庫連接。
2、經過第二部分的操作,對項目模塊化的概念以及各個模塊的功能有了清晰的認識,並學會了在模塊中使用不同模塊建立的方法。例如:數據層模塊負責導入數據的語句且相關語句會封裝成方法,業務邏輯層模塊負責業務處理語句,相關語句也會封裝成方法,而視圖層模塊負責結果展示的語句;並且業務邏輯層模塊會調用數據層模塊建立的方法,而視圖層模塊則會調用業務邏輯層模塊建立的方法。
3、核心總結為一句:「先模仿後發揮,先整體後局部」。一開始最重要的是跟隨高手模仿,此處的模仿就是根據猴子老師設計的課程(事後反思,該課程循序漸進,為數據分析新手設計的足夠用心,簡直太棒啦,此處你也可以認為是打廣告!)一步一步完全相同的敲代碼。先別發揮自己的想法,僅僅做讓大多數人為之鄙視的「照抄」動作甚至投機取巧的「複製、粘貼」即可。實現整個過程後,這種做法會在內心中產生極大地甚至盲目地自信和愉悅感,這對一個新手來說太重要、太重要、太重要啦!初步模仿成功後,反思並總結整個分析的過程,將會建立一個整體的框架和脈絡;然後發揮自己的主觀能動性,著重解決局部的問題,即琢磨某個不懂的語句,為什麼這麼寫代碼,這樣做的邏輯是什麼等等。
推薦閱讀:
※R語言分析NBA球員數據
※我為什麼開始學習數據分析
※Learn R | GBDT of Data Mining(四)
※精選 | 2017年10月份R新包