iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 13
1
Big Data

R語言與機器學習見面會系列 第 13

Day13 R語言外部資料介面(json)

除了檔案的資料介面,在網際網路中為了方便傳輸資料,資料在傳遞前都會進行序列化(serialize),json、soap、binary和xml都是經常選擇的格式。

常遇到具有REST Api Http服務的資料集提供者,其中json格式大概是目前最常見的選擇,2016這年頭SQL Server也支援json儲存了,未來我們應該有許多機會常和json格式碰到面,今天來複習JSON(JavaScript Object Notation)格式載入。

我們在資料夾MyR新增一支Day13.R
http://ithelp.ithome.com.tw/upload/images/20161213/20103434VuqqgTG8in.png

Web AI


API (application Programming Interface)
這邊我們舉Data.Taipei 臺北市政府資料開放平台api資料中的北捷起訖站點時間作為範例,我們將她載入成DataFrame格式。

#載入jsonlite package 
library(jsonlite) 
data <- fromJSON("http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=55ec6d6e-dc5c-4268-a725-d04cc262172b") 
data 

載入結後dataframe
http://ithelp.ithome.com.tw/upload/images/20161213/20103434FxdpViHtpS.jpg

資料集描述: 提供臺北捷運文湖線、淡水信義線、松山新店線、中和新蘆線以及板南線之列車進入月台之車站站名、行駛方向等資料。

主要欄位說明: Station(列車進入月台車站站名)、Destination(行駛目的地)、UpdateTime(資料更新時間)

是不是超簡單的!

Data.Taipei 臺北市政府資料開放平台API使用手冊、使用規範及清單可以參閱以下連結:
http://data.taipei/opendata/aboutus

實體檔案


複習完web api了,接著我們來準備兩份. Json檔案 ,並且分別使用兩種json結構(json object及json array)。

http://ithelp.ithome.com.tw/upload/images/20161213/201034341qBUSlWg7C.jpg

Json object格式

Lalaga1.json

{ 
  "Id": [ 1, 2, 3 ], 
  "NAME": [ "Barcelona", "Real Madird", "Atletico Madrid" ], 
  "win": [ 29, 28, 28 ], 
  "draw": [ 4, 6, 4 ], 
  "lose": [ 5, 4, 6 ], 
  "Goal": [ 112, 110, 63], 
  "Pts": [ 91, 90, 88 ] 
} 

Json array 格式

Lalaga2.json

[ 
   { 
    "Id": 1, 
    "NAME": "Barcelona", 
    "win": 29, 
    "draw": 4, 
    "lose": 5, 
    "Goal": 112, 
    "Pts": 91 
  }, 
  { 
    "Id": 2, 
    "NAME": "Real Madird", 
    "win": 28, 
    "draw": 6, 
    "lose": 4, 
    "Goal": 110, 
    "Pts": 90 
  }, 
  { 
    "Id": 3, 
    "NAME": "Atletico Madrid", 
    "win": 28, 
    "draw": 4, 
    "lose": 6, 
    "Goal": 63, 
    "Pts": 88 
  } 
]

Json object載入Dataframe


在Day13.R中輸入程式碼

#載入rjson package 
library("rjson") 
 
#載入json檔案1 
result <- fromJSON(file = "E:\\XXX\\R\\RTVS-docs-master\\examples\\MyR\\Laliga1.json") 
 
#將json載入到dataframe 
json_data_frame <- as.data.frame(result) 
 
#列印dataframe 
print(json_data_frame) 

執行結果:
http://ithelp.ithome.com.tw/upload/images/20161213/20103434idtNGpxsjD.jpg

Json Array載入Dataframe


由於讀取進來的結構是兩層list,我們需要從json結構中拆解然後轉換成dataframe,這邊會簡單使用到lapply函式。

在Day13.R中輸入程式碼

library("plyr")
library("rjson")

#載入json檔案2
result <- fromJSON(file = "E:\\CyberCArd2\\R\\RTVS-docs-master\\RTVS-docs-master\\examples\\MyR\\Laliga2.json")

dfs <- lapply(result, function(j) {
    as.data.frame(j)
})

載入後的result
http://ithelp.ithome.com.tw/upload/images/20161213/20103434kUyYOH3Wc5.png

套lapply先整理成三個list
http://ithelp.ithome.com.tw/upload/images/20161213/20103434yHYOOFMZmZ.jpg

最後使用rbind結合成dataframe

#plyr rbind(row bind)  
df <- rbind.fill(dfs) 
df 

執行結果
http://ithelp.ithome.com.tw/upload/images/20161213/201034349cOhbkewnV.jpg

序列化(Serialization)


複習完json格式載入,那麼如果想到dataframe序列化為json格式?

在Day13.R中輸入程式碼

#json object 
cat(toJSON(df)) 

執行結果
http://ithelp.ithome.com.tw/upload/images/20161213/20103434CeVJLGIUft.png

#json array 
cat(toJSON(unname(alply(df, 1, identity)))) 

執行結果
http://ithelp.ithome.com.tw/upload/images/20161213/20103434BEclk2AiJJ.png

這樣我們就可以依照需求轉換為指定的json結構。
一直覺得有一天JSON會統治全世界。


2013-1016法甲冠軍,PSG巴黎聖日耳曼主場
http://ithelp.ithome.com.tw/upload/images/20161213/201034346IxITBuSLc.jpg
2009-10攝於王子球場,paris,france


上一篇
Day12 R語言外部資料介面(Excel)
下一篇
Day14 R語言外部資料介面(SQL Server)
系列文
R語言與機器學習見面會30

尚未有邦友留言

立即登入留言