12.6 JSON 데이터 가져오기

JSON (JavaScript Object Notation)은 일부 프로그래머가 csv 또는 기타 2 차원 데이터 형식에 비해 익숙하지 않을 수있는 데이터 형식이다. JSON 데이터 형식은 구조화된 형식을 유지하면서 텍스트 형식으로 쉽게 전송할 수 있도록 설계되었다.

다음은 JSON 데이터의 예이다.

life_json <- '[{"year":2015, "race":"All Races", "sex":"Both Sexes", "death":733.1},
               {"year":2014, "race":"All Races", "sex":"Both Sexes", "life":78.9, "death":724.6},
               {"year":2013, "race":"All Races", "sex":"Both Sexes", "life":78.8, "death":731.9},
               {"year":2012, "race":"All Races", "sex":"Both Sexes", "life":78.8, "death":732.8},
               {"year":2011, "race":"All Races", "sex":"Both Sexes", "life":78.7, "death":741.3},
               {"year":2010, "race":"All Races", "sex":"Both Sexes", "life":78.7, "death":747}]'

이것은 우리가 이 과정 전체에서 작업한 기대 수명 데이터의 일부이다. 이 데이터에 대해 어느 정도 이해할 수는 있지만 친숙한 형식과는 거리가 멀다.

이와 같은 데이터로 작업하려면 jsonlite 패키지를 사용할 수 있다. 다음 코드로이 패키지를 설치한다.

# install.packages("jsonlite")

이제 위의 JSON 데이터가 life_json이라는 개체에 저장되어 있다고 가정하면 데이터를 다음과 같은 간단한 코드 줄과 함께 사용할 수있는 깔끔한 형식으로 변환할 수 있다.

library(tidyverse)
library(jsonlite)
## 
## Attaching package: 'jsonlite'
## The following object is masked from 'package:purrr':
## 
##     flatten
life <- fromJSON(life_json)
life

위의 라이브러리 참조를 포함했다. 이 데이터 프레임을 가져 오기 위해 명령 줄에 개체 이름 life를 입력하여 결과를 검사할 수 있다.

##   year race      sex        death life
## 1 2015 All Races Both Sexes 733.1   NA
## 2 2014 All Races Both Sexes 724.6 78.9
## 3 2013 All Races Both Sexes 731.9 78.8
## 4 2012 All Races Both Sexes 732.8 78.8
## 5 2011 All Races Both Sexes 741.3 78.7
## 6 2010 All Races Both Sexes 747.0 78.7

jsonlite 패키지의 fromJSON 함수는 파일을 데이터 프레임으로 자동 변환한다. 이 함수는 자동으로 할 수있는 가장 높은 수준의 개체를 반환한다. 우리의 데이터는 우리가 받은 데이터 프레임에 깔끔하게 들어 맞는다. 그러나 기본 데이터 프레임이 이 구조에 맞지 않으면 JSON 파일의 구조를 반영하는 리스트 개체가 될 수 있다.

참고로, 우리가 사용하고 있는 expectancy 데이터 프레임을 json 파일로 변경할 수도 있다. 이를 위해 toJSON() 함수를 다음과 같이 이용하면 된다. expectancy 데이터 세트의 처음 5개 행만 json 파일로 변경해 본다.

json_life <- toJSON(expectancy[1:5, ])
json_life
## [{"Year":1900,"Race":"All Races","Sex":"Both Sexes","Average Life Expectancy (Years)":47.3,"Age-adjusted Death Rate":2518},{"Year":1901,"Race":"All Races","Sex":"Both Sexes","Average Life Expectancy (Years)":49.1,"Age-adjusted Death Rate":2473.1},{"Year":1902,"Race":"All Races","Sex":"Both Sexes","Average Life Expectancy (Years)":51.5,"Age-adjusted Death Rate":2301.3},{"Year":1903,"Race":"All Races","Sex":"Both Sexes","Average Life Expectancy (Years)":50.5,"Age-adjusted Death Rate":2379},{"Year":1904,"Race":"All Races","Sex":"Both Sexes","Average Life Expectancy (Years)":47.6,"Age-adjusted Death Rate":2502.5}]