5 資料讀取與匯出

資料(Data)在維基百科的定義是values of qualitative or quantitative variables, belonging to a set of items.,一般來說,在資料分析前會經過多個步驟,包括資料匯入Chapter 5資料清洗處理Chapter 6並轉換為Tidy data、資料分析Chapter 7資料呈現與視覺化Chapter 8

資料有多種可能來源,包括:

  • 硬碟
  • 網路下載
  • Open Data (API)
  • 網頁裡 (爬蟲!)
  • 任何地方

以下介紹由檔案、網路等來源匯入多種資料格式的匯入方式,以及建議的資料匯出方法。

5.1 從檔案匯入基本資料格式

5.1.1 Import Dataset功能 (RStudio)

RStudio 1.0版後即提供很好的資料匯入介面,使用者可以不用撰寫任何程式碼,就能完成.csvExcel以及SAS等檔案匯入。首先選取RStudio四分割視窗右上角的Environment標籤,選擇Import Dataset,就會出現檔案格式的選項

以csv檔案為例,在選單中選取From CSV,選取後會跳出資料匯入輔助視窗,點選Browse按鈕開啟檔案選取器,並點選欲匯入之文字檔案

檔案選取後,資料匯入輔助視窗有預覽功能,供使用者檢查資料匯入方法是否正確,若需調整各項參數,可利用下方Import Options的選項微調,最常用的調整功能是Delimiter分隔符號與First Row as Names首列是否為欄位名稱。

如果要匯入的檔案為tab分隔文字檔,一樣可以選擇.csv選項,再修改Delimiter參數為Tab即可。

資料匯入輔助視窗右下方Code Preview:子視窗中會自動產生資料匯入程式碼,如果未來想再使用視窗匯入,希望透過程式碼匯入,可以將此段程式碼複製貼上到R程式碼檔案(.R),供後續分析使用。

5.1.2 分隔文字檔 .txt

readr (Wickham, Hester, and Francois 2016) package提供完整的文字檔讀取功能,各讀取函數的第一個參數通常為檔案路徑與名稱read_delim()函數可用來讀取所有用分隔符號分隔的文字檔案,以tab分隔為例,只需將delim參數設定為\t,即可用tab將各欄位分開讀取。此外,col_names參數也常被使用,TRUE代表資料內有包含欄位名稱(通常在首列),預設為TRUE,如果設定為FALSE,欄位名稱則會依順序被設定為 X1, X2, X3 …。

參數整理如下 (可用?read_delim指令閱讀官方說明):

  • file, 檔名
  • delim, 分隔符號
  • quote, 把欄位包起來的符號
  • escape_backslash, 預設FALSE,是否用/作為逃脫符號
  • escape_double, 預設TRUE,是否用quote符號作為逃脫符號
  • col_names, 是否有欄位名稱(表頭)(T/F)
  • col_types, 每一個欄位的類別,用向量表示
  • comment, 備註標示符號,在備註標示符號之後的文字不會被讀入
  • skip, 要跳過幾行?
library(readr)
dataset <- read_delim("檔案路徑與名稱", delim="\t")

5.1.3 CSV檔案 .csv

readr (Wickham, Hester, and Francois 2016) package也提供CSV (逗號分隔)檔案的讀取功能,read_csv()

library(readr)
dataset <- read_csv("檔案路徑與名稱")

5.1.4 Excel檔案 .xls

readxl (Wickham 2016a) package提供讀取Excel檔案 (xls, xlsx)的函數read_excel(),除了常用的col_names參數外,也可使用sheet參數設定要讀取的工作表(sheet)

library(readxl)
dataset <- read_excel("檔案路徑與名稱")

5.1.5 R物件 .rds

R物件有檔案小與讀取快速的優點,如果在R程式處理資料後必須儲存一份以供後續分析的話,使用R物件儲存是最佳的方式,讀取R物件有多種函數可供選擇,推薦使用readRDS()函數 (參考資料:A better way of saving and loading objects in R)

dataset <- readRDS("檔案路徑與名稱")

5.1.6 R程式 .R

source, 讀R的Obejct or script, 執行, ASCII (dump的相反)

5.1.7 純文字資料 (無分隔)

readLines, 逐行讀取文字資料

5.1.8 其他格式

透過載入套件,R可讀入許多其他格式的檔案:

  • MySQL RMySQL
  • HDF5 rhdf5
  • Weka foreign
  • Stata foreign
  • SPSS Hmisc
  • SAS Hmisc
  • GIS rgdal
  • Images jpeg
  • Music tuneR

5.1.9 其他讀檔注意事項

讀檔的時候R會自動

  • 跳過#開頭的任何行(Row)
  • 判斷要讀幾行
  • 判斷每個列(Column)的類別
  • 把欄位包起來的符號

如果讀取時已指定Column類別以及把欄位包起來的符號,讀取速度會快很多。

5.2 從網路匯入資料

5.2.1 Open Data

開放資料 (Open data) 指的是一種經過挑選與許可的資料,這些資料不受著作權、專利權,以及其他管理機制所限制,可以開放給社會公眾,任何人都可以自由出版使用,不論是要拿來出版或是做其他的運用都不加以限制。Open data 運動希望達成的目標與開放原始碼、內容開放、開放獲取等其他「開放」運動類似。Open data 背後的核心思想由來已,但 Open data 這名詞直到近代才出現,拜網際網路崛起而為人所知,尤其是 Data.gov 等 Open data 政府組織的設立。(維基百科)

台灣政府從2011年開始大力推動開放政府與開放資料的概念,多個機關與縣市政府架設開放資料平台,供民眾擷取或再利用各項資料

Open Data常見的儲存方式為: CSVChapter 5.1.3JSONChapter 5.2.3XMLChapter 5.2.4,開放資料網站通常有提供民眾直接下載檔案的服務,針對可下載的CSV格式資料,可以下載完成後,透過上述由檔案匯入資料 Chapter 5.1方法匯入即可。

5.2.2 API (Application programming interfaces)

應用程式介面 Application programming interfaces (API) 通常是特定軟體、程序或系統,廠商或開發人員,為了能夠讓第三方的開發者可以額外開發應用程式來強化他們的產品,所推出可以與他們系統溝通的介面。(維基百科)

以下載Open Data為例,若檔案更新頻繁,使用手動下載相當耗時。如臺北市開放認養動物資料,更新頻率為每日,所以許多開放資料也提供透過API下載的服務,透過API下載的資料格式會是JSON格式Chapter 5.2.3,如臺北市開放認養動物API資訊所示,開放資料網站會提供資料集ID資料RID

  • 資料集ID: 紀錄資料的基本參數,如包含欄位、更新頻率等
  • 資料RID: 資料集

並同時提供擷取範例,如果需要下載原始資料,可直接從範例複製貼上即可,如http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=f4a75ba9-7721-4363-884d-c3820b0b917c

5.2.3 JSON格式檔案

JSON (Javascript Object Notation)是一種輕量級的資料交換語言 (Wiki),特色如下:

  • from application programming interfaces (APIs)
  • JavaScript、Java、Node.js應用
  • 一些NoSQL非關連型資料庫用JSON儲存資料:MongoDB
  • 資料儲存格式
    • Numbers (double)
    • Strings (double quoted)
    • Boolean (true or false)
    • Array (ordered, comma separated enclosed in square brackets )
    • Object (unorderd, comma separated collection of key:value pairs in curley brackets {})

JSON檔案範例

許多Open Data也用JSON格式儲存,例如臺北市開放認養動物資料,根據資料的API資訊,可得資料擷取網址http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=f4a75ba9-7721-4363-884d-c3820b0b917c 。

將JSON檔案匯入R可以使用jsonlite(Ooms, Temple Lang, and Hilaiel 2016) package,套件使用前必須安裝,安裝套件方法請參考Chapter 1,載入後,可使用fromJSON()函數載入JSON資料。 如需直接從API網址截取資料,需要載入RCurl(Temple Lang and CRAN team 2016) package,並使用getURL()函數處理資料擷取網址。

library(jsonlite)
library(RCurl)
PetData<-fromJSON(getURL("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=f4a75ba9-7721-4363-884d-c3820b0b917c"))
str(PetData)
## List of 1
##  $ result:List of 5
##   ..$ offset : int 0
##   ..$ limit  : int 10000
##   ..$ count  : int 305
##   ..$ sort   : chr ""
##   ..$ results:'data.frame':  305 obs. of  20 variables:
##   .. ..$ _id            : chr [1:305] "1" "2" "3" "4" ...
##   .. ..$ Name           : chr [1:305] "花俏" "麥茶" "" "金兒" ...
##   .. ..$ Sex            : chr [1:305] "雌" "雄" "雌" "雌" ...
##   .. ..$ Type           : chr [1:305] "貓" "貓" "犬" "貓" ...
##   .. ..$ Build          : chr [1:305] "中" "中" "幼" "中" ...
##   .. ..$ Age            : chr [1:305] "成年" "成年" "幼齡" "成年" ...
##   .. ..$ Variety        : chr [1:305] "米克斯" "米克斯" "米克斯" "米克斯" ...
##   .. ..$ Reason         : chr [1:305] "動物救援" "動物管制" "民眾拾獲" "動物管制" ...
##   .. ..$ AcceptNum      : chr [1:305] "106031204" "106031003" "106031021" "106030705" ...
##   .. ..$ ChipNum        : chr [1:305] "" "" "" "" ...
##   .. ..$ IsSterilization: chr [1:305] "未絕育" "未絕育" "未絕育" "未絕育" ...
##   .. ..$ HairType       : chr [1:305] "三花" "黃白" "黑" "三花" ...
##   .. ..$ Note           : chr [1:305] "大家好~我的名字叫花俏,漂亮的我想要找個長期飯票,這個人會是你嗎?讓我們給彼此一個機會吧!!\n" "大家好,我叫麥茶,\n淡淡憂鬱的我有吸引你嗎?\n個性有點緊張、怕人,\n要花時間慢慢培養感情,等待我熟悉,\n你願意給我機會,讓我進"| __truncated__ "" "你好,我叫金兒。\n個性緊張,不會靠人很近,\n因為貓咪很獨立,需要好長時間適應。\n但我還是想要在心情好的時候有人陪伴,\n你可以來"| __truncated__ ...
##   .. ..$ Resettlement   : chr [1:305] "臺北市動物之家 收容編號106031204" "臺北市動物之家 收容編號106031003" "臺北市動物之家 收容編號106031021" "臺北市動物之家 收容編號106030705" ...
##   .. ..$ Phone          : chr [1:305] "02-87913062" "02-87913062" "02-87913062" "02-87913062" ...
##   .. ..$ Email          : chr [1:305] "tcapoa8@mail.taipei.gov.tw" "tcapoa8@mail.taipei.gov.tw" "tcapoa8@mail.taipei.gov.tw" "tcapoa8@mail.taipei.gov.tw" ...
##   .. ..$ ChildreAnlong  : chr [1:305] "" "" "" "" ...
##   .. ..$ AnimalAnlong   : chr [1:305] "" "" "" "" ...
##   .. ..$ Bodyweight     : chr [1:305] "" "" "" "" ...
##   .. ..$ ImageName      : chr [1:305] "http://163.29.39.183/uploads/images/medium/e0de6dfd-332e-459b-b157-36b006a1924c.jpg" "http://163.29.39.183/uploads/images/medium/c5983ea5-b55a-4bd1-bb3b-2c03f8e496a2.jpg" "http://163.29.39.183/uploads/images/medium/c9318c07-988d-4ac4-b7ba-ddba0968759c.jpg" "http://163.29.39.183/uploads/images/medium/dc71f0d8-74fd-4ffb-b41d-2c4aa62a49db.jpg" ...

由資料結構可知,經過fromJSON()函數匯入的JSON檔案被轉存為列表list的型態,且在result元素中包含五個子元素(offset, limit, count, sort, results),其中,results子元素的類別為資料框data.frame,內含開放認養動物清單,因此,可使用$符號截取元素與子元素

head(PetData$result$results)
##   _id Name Sex Type Build  Age Variety   Reason AcceptNum ChipNum
## 1   1 花俏  雌   貓    中 成年  米克斯 動物救援 106031204        
## 2   2 麥茶  雄   貓    中 成年  米克斯 動物管制 106031003        
## 3   3       雌   犬    幼 幼齡  米克斯 民眾拾獲 106031021        
## 4   4 金兒  雌   貓    中 成年  米克斯 動物管制 106030705        
## 5   5       雄   犬    大 老年  米克斯 動物管制 106030702        
## 6   6 溫蒂  雌   貓    中 成年  米克斯 動物管制 106030616        
##   IsSterilization HairType
## 1          未絕育     三花
## 2          未絕育     黃白
## 3          未絕育       黑
## 4          未絕育     三花
## 5          未絕育       黑
## 6          未絕育   虎斑白
##                                                                                                                                                                    Note
## 1                                                                            大家好~我的名字叫花俏,漂亮的我想要找個長期飯票,這個人會是你嗎?讓我們給彼此一個機會吧!!\n
## 2 大家好,我叫麥茶,\n淡淡憂鬱的我有吸引你嗎?\n個性有點緊張、怕人,\n要花時間慢慢培養感情,等待我熟悉,\n你願意給我機會,讓我進入你的家庭嗎,\n歡迎來動物之家看看我唷!
## 3                                                                                                                                                                      
## 4                               你好,我叫金兒。\n個性緊張,不會靠人很近,\n因為貓咪很獨立,需要好長時間適應。\n但我還是想要在心情好的時候有人陪伴,\n你可以來看看我嗎!
## 5                                                                                                                                                                      
## 6                                                                                                  嗨~我叫溫蒂,我想要一個溫暖安穩的家,您可以來認養我,完成我的願望嗎?
##                       Resettlement       Phone                      Email
## 1 臺北市動物之家 收容編號106031204 02-87913062 tcapoa8@mail.taipei.gov.tw
## 2 臺北市動物之家 收容編號106031003 02-87913062 tcapoa8@mail.taipei.gov.tw
## 3 臺北市動物之家 收容編號106031021 02-87913062 tcapoa8@mail.taipei.gov.tw
## 4 臺北市動物之家 收容編號106030705 02-87913062 tcapoa8@mail.taipei.gov.tw
## 5                                                                        
## 6 臺北市動物之家 收容編號106030616 02-87913062 tcapoa8@mail.taipei.gov.tw
##   ChildreAnlong AnimalAnlong Bodyweight
## 1                                      
## 2                                      
## 3                                      
## 4                                      
## 5                                      
## 6                                      
##                                                                             ImageName
## 1 http://163.29.39.183/uploads/images/medium/e0de6dfd-332e-459b-b157-36b006a1924c.jpg
## 2 http://163.29.39.183/uploads/images/medium/c5983ea5-b55a-4bd1-bb3b-2c03f8e496a2.jpg
## 3 http://163.29.39.183/uploads/images/medium/c9318c07-988d-4ac4-b7ba-ddba0968759c.jpg
## 4 http://163.29.39.183/uploads/images/medium/dc71f0d8-74fd-4ffb-b41d-2c4aa62a49db.jpg
## 5 http://163.29.39.183/uploads/images/medium/4d5c0ba3-37d0-4c5c-9f01-0d3574eb4d56.jpg
## 6 http://163.29.39.183/uploads/images/medium/2aa99d15-6ead-4824-9725-090a79844788.jpg

results資料框中包含20個欄位,可以像分析資料框一樣,針對此資料框做分析,舉例來說,可分析各項開放認養理由出現次數

table(PetData$result$results$Reason)
## 
##                  動物救援     動物管制 民眾不擬續養     民眾拾獲 
##           26           94          120           44           21

分析可知開放認養理由以動物管制與未填寫居多。

如果需要將資料框轉換成JSON檔案可以使用jsonlite package所提供的toJSON()函數。

myjson <- toJSON(iris, pretty=TRUE)
str(myjson)
## Class 'json'  chr "[\n  {\n    \"Sepal.Length\": 5.1,\n    \"Sepal.Width\": 3.5,\n    \"Petal.Length\": 1.4,\n    \"Petal.Width\": 0.2\n  },\n  {\"| __truncated__

5.2.4 XML 可延伸標記式語言

  • Extensible markup language
  • 描述結構化資料的語言
  • 處理XML檔案是網頁Html爬蟲的基礎
  • Components
    • Markup 標記 - labels that give the text structure
    • Content 內文 - the actual text of the document
  • XML Wiki

Tags, elements and attributes

  • Tags correspond to general labels
    • Start tags <breakfast_menu>, <price>
    • End tags </breakfast_menu>,</price>
    • Empty tags <line-break />
  • Elements are specific examples of tags
    • <name>Belgian Waffles</name>
  • Attributes are components of the label
    • <book category="web">

許多Open Data也用XML格式儲存,例如臺北市水質監測資訊。如需將XML檔案匯入R中,需要安裝XML (Temple Lang and CRAN Team 2016) package,使用xmlParse()函數將檔案匯入。

library(XML)
waterQ <- xmlParse("http://data.taipei/opendata/datalist/datasetMeta/download?id=961ca397-4a59-45e8-b312-697f26b059dc&rid=190796c8-7c56-42e0-8068-39242b8ec927")

使用xpathSApply()函數取得指定標籤內的資料

#取得所有"code_name"標籤內的資料
xpathSApply(waterQ,"//code_name",xmlValue)[1:10]
##  [1] "雙溪淨水場"               "衛理女中"                
##  [3] "雙溪國小                " "華興加壓站"              
##  [5] "長興淨水場"               "市政大樓"                
##  [7] "市議會"                   "捷運忠孝復興站"          
##  [9] "南港高工"                 "南港加壓站"
#取得各監測站的經度
xpathSApply(waterQ,"//longitude",xmlValue)[1:10]
##  [1] "121.56094" "121.54401" "121.55557" "121.53476" "121.54043" "121.55661"
##  [7] "121.55360" "121.53551" "121.59892" "121.60829"

5.2.5 網頁爬蟲 Webscraping

由於不是每個網站都提供API,但網頁上卻有你想要分析的資料(像是ptt推文!?),除了人工複製貼上以外,也可以將網頁處理程式化,以程式化的方式擷取網頁資料就叫做網頁爬蟲(Webscraping)Webscraping Wiki)。在R中可以直接把HTML檔案當作XML檔案處理分析,也可使用rvest(Wickham 2016c) package輔助爬蟲程式撰寫。

此外,網頁爬蟲可能耗費很多網頁流量和資源,所以在許多網站被視為非法行為,如果一次讀太多太快,很可能被鎖IP。

長庚資管系網站為例,可直接逐行讀取 readLines()

con <- url("http://im.cgu.edu.tw/bin/home.php")
htmlCode <-readLines(con)
## Warning in readLines(con): incomplete final line found on 'http://im.cgu.edu.tw/
## bin/home.php'
close(con)
htmlCode[1:5]
## [1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"                
## [2] "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"zh-tw\">"                                                                                 
## [3] "<head>"                                                                                                                                       
## [4] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"                                                                    
## [5] "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\" /><meta name=\"keywords\" content=\"請填寫網站關鍵記事,用半角逗號(,)隔開\" />"

讀取完網頁後,使用用XML工具分析擷取網頁 (XML package)

library(httr)
html <- htmlParse(GET("http://im.cgu.edu.tw/bin/home.php"))
## No encoding supplied: defaulting to UTF-8.
xpathSApply(html, "//title", xmlValue)
## [1] "長庚大學 資訊管理學系 "
xpathSApply(html, "//span[@class='ptname ']", xmlValue)
##  [1] "畢業專題成果展"       "碩士班計畫書審查"     "畢業校友資料登錄"    
##  [4] "長庚大學首頁"         "校務資訊系統"         "人事教育訓練資訊網"  
##  [7] "資管系導師名單"       "TA課後輔導值班表"     "碩博士論文網"        
## [10] "國內資管系所"         "資管系內部行政系統"   "資管系分機表"        
## [13] "資管系學會"           "工商管理學系/研究所"  "工業設計學系/研究所" 
## [16] "管理學院"             "醫務管理學系/研究所"  "商管專業學院"        
## [19] "企業管理研究所博士班" "長庚大學行事曆"

除了把HTML檔案當作XML處理外,rvest(Wickham 2016c) package是R語言中最常被使用的爬蟲套件,使用前一樣需要安裝與載入

install.packages("rvest") ##安裝
library(rvest) ##載入

載入rvest套件後,經由以下步驟進行網站解析:

  • 使用read_html(“欲擷取的網站網址”)函數讀取網頁
  • 使用html_nodes()函數擷取所需內容 (條件為CSS或xpath標籤)
  • 使用html_text()函數處理/清洗擷取內容,留下需要的資料
  • 使用html_attr()函數擷取資料參數(如連結url)
YahooNewsurl="https://tw.news.yahoo.com/"
news_title = read_html(YahooNewsurl) %>% html_nodes(".tpl-title a") %>% html_text()
news_url = read_html(YahooNewsurl) %>% html_nodes(".tpl-title a") %>% html_attr("href")
Yahoo_news = data.frame(title = news_title, url=news_url)
head(Yahoo_news)
                                    title                                                           url
1         曾1妻5妾好風光 男星慘賣豪宅還債 /從1妻5妾的風光到變賣豪宅還債-網友噓雷洪:活該-091741737.html
2          美報告:美棄「一中」台灣更危險               /美報告-美拋棄-中-台灣處境更危險-081036215.html
3           藍色凍蕃薯!1張圖看寒流有多冷       /霸王級寒流再襲台-張圖看懂這波寒流有多強-101500692.html
4           他被妻子戴綠帽 對象竟是親弟弟                 /他被妻子戴綠帽-對象竟是親弟弟-072010033.html
5               匆忙推出移民禁令 他後悔了           /匆忙推移民禁令-美國土安全部長表後悔-044517088.html
6 蔡政府對釣魚台態度 國民黨憂美日安保質變       /蔡政府對釣魚台態度-國民黨憂美日安保質變-160200179.html

html_nodes()html_text()html_attr()函數中,擷取條件的撰寫會因網頁語法不同而有差異,必須要使用Google Chrome開發工具等工具輔助觀察需要擷取資料的條件。以上述Yahoo新聞為例,需要擷取的資料所在HTML片段如下:

<ul class="tpl-title yom-list list-style-none" id="yui_3_9_1_1_1486568229946_2408">
<li class="list-story first" id="yui_3_9_1_1_1486568229946_2407">
<div class="txt" id="yui_3_9_1_1_1486568229946_2406">
<a href="/從1妻5妾的風光到變賣豪宅還債-網友噓雷洪:活該-091741737.html" class="title " data-ylk="pkg:96a0ca11-47bc-3100-81ad-0a288707f150;ver:60cdb126-ee0c-11e6-bb9b-8a777738a932;lt:i;pos:1;" data-rapid_p="1">曾1妻5妾好風光 男星慘賣豪宅還債</a>
<cite id="yui_3_9_1_1_1486568229946_2405">
<span class="provider" id="yui_3_9_1_1_1486568229946_2404">Yahoo奇摩娛樂新聞</span>
</cite></div></li>
....

觀察上述程式碼可已發現新聞清單被包含在ul標籤下,且css class為tpl-title yom-list list-style-none,所以這邊可以使用第一個classtpl-title為篩選條件。網頁爬蟲需要多做觀察與練習,才可熟知篩選技巧。

其他爬蟲相關參考資源:

5.3 Facebook資料擷取

Facebook提供Graph API,讓應用程式可透過API讀取與寫入 Facebook相關資料,Graph API會根據篩選條件,回傳JSON格式的資料。除此之外,Facebook還提供Graph API Explorer,讓程式開發人員可以測試資料撈取方法和結果。 在開始使用Graph API之前,必須要取得自己的access token (存取權杖),Graph API Explorer工具提供Get Token按鈕(通常在視窗右上角),可以讓開發者在不用新增應用程式(Application)的情況下取得暫時的access token

有關Facebook access token的詳細介紹,可參考官方文件

5.3.1 Graph API in R

library(httr)
token<-"your token" #將access token複製到此處 
FBData = GET(
    paste0("https://graph.facebook.com/v2.8/tsaiingwen?fields=posts%7Bmessage%7D&access_token=",
           token))
names(FBData)
## [1] "url"         "status_code" "headers"     "all_headers" "cookies"     "content"     "date"       
## [8] "times"       "request"     "handle"    
json1 = content(FBData)
names(json1)
## [1] "posts" "id"
names(json1$posts)
## [1] "data"   "paging"
head(json1$posts$data,3)
[[1]]
[[1]]$message
[1] "「國機國造」不是夢想,而是一個行動。今天啟動的高級教練機「自研自製」任務,是國防自主的重要里程碑。我們不只要讓戰機起飛,更要讓產業起飛。\n\n國防產業同樣是「5+2」關鍵產業之一,所以,除了要如期、如質完成新式高教機的「自研自製」外,也要重新厚植台灣的航太工業人才鏈,以及加強相關產業的連結、轉型和升級。\n\n國防自主沒有捷徑,只有努力再努力、堅持再堅持。今天,我們重新跨出歷史性的一步。"

[[1]]$id
[1] "46251501064_10154006497451065"


[[2]]
[[2]]$message
[1] "今天,智慧機械推動辦公室正式啟動。「落實產學合作」、「支持創新研發」、「強化行銷通路」是辦公室的三項重點任務。\n\n智慧機械是「5+2」關鍵產業的其中之一。政府有決心。我相信,所有的機械業者-無論做的是螺桿、刀庫、控制器或是工作母機,大家也都有很強的決心,要走向創新、走向智慧化、走向品牌。我們是一個團隊,我們一起加油!"

[[2]]$id
[1] "46251501064_10154006456601065"


[[3]]
[[3]]$message
[1] "今天來向台商拜個晚年。我也邀請台商朋友們,共同參與台灣經濟轉型升級的世紀工程。\n\n無論是擴大對國內的投資,或者配合新南向政策,前進海外深耕佈局,我期待跟台商朋友們一起努力,群策群力,克服困難和瓶頸,為台灣經濟發展打開全新的局面。"

[[3]]$id
[1] "46251501064_10154001652641065"
json1$posts$data[[1]]$message
##[1] "「國機國造」不是夢想,而是一個行動。今天啟動的高級教練機「自研自製」任務,是國防自主的重要里程碑。我們不只要讓戰機起飛,更要讓產業起飛。\n\n國防產業同樣是「5+2」關鍵產業之一,所以,除了要如期、如質完成新式高教機的「自研自製」外,也要重新厚植台灣的航太工業人才鏈,以及加強相關產業的連結、轉型和升級。\n\n國防自主沒有捷徑,只有努力再努力、堅持再堅持。今天,我們重新跨出歷史性的一步。"

5.3.2 Rfacebook package

除了直接使用Graph API外,也可使用Rfacebook(Barbera, Piccirilli, and Geisler 2017) package來讀取Facebook資料。 以下為使用Rfacebook取得 tsaiingwen 粉絲頁的資料範例:

library(Rfacebook)
token<-"your token" #將token複製到此處 
getPage("tsaiingwen", token,n = 5)
5 posts       from_id           from_name
1 46251501064 蔡英文 Tsai Ing-wen
2 46251501064 蔡英文 Tsai Ing-wen
3 46251501064 蔡英文 Tsai Ing-wen
4 46251501064 蔡英文 Tsai Ing-wen
5 46251501064 蔡英文 Tsai Ing-wen
                                                                                                                                                                                                                                                                                                                                                                                        message
1 「國機國造」不是夢想,而是一個行動。今天啟動的高級教練機「自研自製」任務,是國防自主的重要里程碑。我們不只要讓戰機起飛,更要讓產業起飛。\n\n國防產業同樣是「5+2」關鍵產業之一,所以,除了要如期、如質完成新式高教機的「自研自製」外,也要重新厚植台灣的航太工業人才鏈,以及加強相關產業的連結、轉型和升級。\n\n國防自主沒有捷徑,只有努力再努力、堅持再堅持。今天,我們重新跨出歷史性的一步。
2                                                                   今天,智慧機械推動辦公室正式啟動。「落實產學合作」、「支持創新研發」、「強化行銷通路」是辦公室的三項重點任務。\n\n智慧機械是「5+2」關鍵產業的其中之一。政府有決心。我相信,所有的機械業者-無論做的是螺桿、刀庫、控制器或是工作母機,大家也都有很強的決心,要走向創新、走向智慧化、走向品牌。我們是一個團隊,我們一起加油!
3                                                                                                                                                          今天來向台商拜個晚年。我也邀請台商朋友們,共同參與台灣經濟轉型升級的世紀工程。\n\n無論是擴大對國內的投資,或者配合新南向政策,前進海外深耕佈局,我期待跟台商朋友們一起努力,群策群力,克服困難和瓶頸,為台灣經濟發展打開全新的局面。
4                                                                                                                                                                                                                                                                                    「快了」!雞年通機捷,等待很值得。大年初四,我來看看機場捷運通車前的準備,也坐捷運到中壢,跟鄉親拜年問好。
5                                                                                                                                                                                                                                                                                                            雞年初三發福袋\n\n臺中豐原慈濟宮、彰化溪湖福安宮、雲林北港朝天宮、嘉義九華山地藏庵
              created_time  type
1 2017-02-07T08:02:45+0000 photo
2 2017-02-07T07:18:00+0000 photo
3 2017-02-05T07:12:52+0000 photo
4 2017-01-31T08:37:42+0000 photo
5 2017-01-30T11:41:07+0000 photo
                                                                                                    link
1 https://www.facebook.com/tsaiingwen/photos/a.390960786064.163647.46251501064/10154006497206065/?type=3
2 https://www.facebook.com/tsaiingwen/photos/a.390960786064.163647.46251501064/10154006455396065/?type=3
3 https://www.facebook.com/tsaiingwen/photos/a.390960786064.163647.46251501064/10154001652641065/?type=3
4 https://www.facebook.com/tsaiingwen/photos/a.390960786064.163647.46251501064/10153989357181065/?type=3
5 https://www.facebook.com/tsaiingwen/photos/a.390960786064.163647.46251501064/10153987089121065/?type=3
                             id likes_count comments_count shares_count
1 46251501064_10154006497451065        2013            125           43
2 46251501064_10154006456601065        2217            163           57
3 46251501064_10154001652641065        9416            920          163
4 46251501064_10153989358051065       34116           1574          373
5 46251501064_10153987095776065       20592            665          269

由於每次擷取資料的比數有上限(大概是30筆左右),如果需要取得更多更長期的資料,就要使用迴圈協助,分批取得資料,透過設定 sinceuntil參數,可設定資料擷取區間。

首先先取得日期向量,供後續迴圈做使用

lastDate<-Sys.Date()
DateVector<-seq(as.Date("2017-01-01"),lastDate,by="5 days")
DateVectorStr<-as.character(DateVector)
DateVectorStr
## "2017-01-01" "2017-01-06" "2017-01-11" "2017-01-16" "2017-01-21" "2017-01-26" "2017-01-31" "2017-02-05"

利用上述日期向量資料,搭配迴圈,依序設定sinceuntil參數

totalPage<-NULL
token<-'your token'
numberOfPost<-30
for(i in 1:(length(DateVectorStr)-1)){
    tempPage<-getPage("tsaiingwen", token,
                      since = DateVectorStr[i],until = DateVectorStr[i+1])
    totalPage<-rbind(totalPage,tempPage)
}
nrow(totalPage)
## 4 posts 8 posts 10 posts 3 posts 2 posts 14 posts 1 posts
## [1] 42

Rfacebook Packages提供其他函數可供使用

5.4 資料匯出

在R中完成資料處理後,有多種匯出選擇,如果是要匯出供他人在其他環境(如Excel)使用,建議匯出成tab分隔的文字檔(.txt)或是逗號分隔的文字檔(.csv);但若是要在R的環境繼續使用,建議匯出成R物件 (.rds),除了可保留欄位型別設定外,讀取速度與檔案大小皆優於文字檔案。

5.4.1 文字檔 .txt

使用write.table()函數寫入檔案,需要參數有

  • x 要匯出的檔案,通常為matrix或是data.frame格式
  • file 檔案名稱
  • append T/F TRUE表示在檔案後端加入文字,F表示直接覆蓋原始檔案 (預設F)
  • quote 是否需要用雙引號將字串包起 (預設T)
  • sep 分隔符號 (預設空白)
  • eol 換行符號
  • na 表示空值的字串
  • dec 小數點表示法
  • row.names T/F 是否需要輸出row names
  • col.names T/F 是否需要輸出column names
  • qmethod 逃脫字串設定
  • fileEncoding 編碼設定
write.table(iris,file="iris.txt",sep=",",row.names = F,col.names = T)

5.4.2 CSV檔 .csv

write.table()類似,使用write.csv()函數寫入檔案

write.csv(iris,file="iris.csv",row.names = F)

5.4.3 R物件 .rds

若是要在R的環境繼續使用,建議匯出成R物件檔案(.rds)

saveRDS(iris,"iris.rds")

References

Wickham, Hadley, Jim Hester, and Romain Francois. 2016. Readr: Read Tabular Data. https://CRAN.R-project.org/package=readr.

Wickham, Hadley. 2016a. Readxl: Read Excel Files. https://CRAN.R-project.org/package=readxl.

Ooms, Jeroen, Duncan Temple Lang, and Lloyd Hilaiel. 2016. Jsonlite: A Robust, High Performance Json Parser and Generator for R. https://CRAN.R-project.org/package=jsonlite.

Temple Lang, Duncan, and the CRAN team. 2016. RCurl: General Network (Http/Ftp/.) Client Interface for R. https://CRAN.R-project.org/package=RCurl.

Temple Lang, Duncan, and the CRAN Team. 2016. XML: Tools for Parsing and Generating Xml Within R and S-Plus. https://CRAN.R-project.org/package=XML.

Wickham, Hadley. 2016c. Rvest: Easily Harvest (Scrape) Web Pages. https://CRAN.R-project.org/package=rvest.

Barbera, Pablo, Michael Piccirilli, and Andrew Geisler. 2017. Rfacebook: Access to Facebook Api via R. https://CRAN.R-project.org/package=Rfacebook.