본문 바로가기

R

[JRI] R Parsing data.frame to JSON

R에서 제공하는 DataSet을 이용하여 JSON형태로 변환해보자.


R에는 다양한 DataSet(data.frame 형태)이 내장되어있다.

DataSet 목록은 아래의 명령어로 확인 가능하다.


> library(help=datasets)


iris DataSet의 일부를 head 메소드로 확인해보면 아래와 같다.

> head(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa


여러 DataSet중에서 위 명령어에서 확인한 iris DataSet을 JSON 데이터로 변환하는 작업은 R 언어 익숙하지 않다면 쉽지 않은 작업이다. 역시나 R 라이브러리 중 RJSONIO가 존재 한다. 해당 RJSONIO로 변환해보면 아래와 같다.


RJSONIO를 사용하겠다고 선언한다.

> library(RJSONIO)


toJSON 메소드에 변환될 iris DataSet을 넘겨주면 된다.

> toJSON(iris)


변환된 결과값은 아래와 같다.

{ "Sepal.Length": [ 5.1, 4.9, 4.7, 4.6, ...생략... 5.9 ],

"Sepal.Width": [ 3.5, 3, 3.2, 3.1, 3.6, ...생략... 3 ],

"Petal.Length": [ 1.4, 1.4, 1.3, 1.5, 1.4,  ...생략... 5.1 ],

"Petal.Width": [ 0.2, 0.2, 0.2, 0.2, 0.2, 0.4,  ...생략... 1.8 ],

"Species": [ "setosa", "setosa", "setosa", "setosa", ...생략... "virginica" ] }


물론 위 결과값은 문제가 없다. 하지만 내가 사용하고자 하는 JSON 구조와는 맞지 않다.

아래와 같은 결과물이 나오길 바랬다.

{"Sepal.Length":5.1,"Sepal.Width":3.5,"Petal.Length":1.4,"Petal.Width":0.2,"Species":"setosa"}


그래서 어찌어찌 JRI(rJava)에서 문자열을 받아서 simple.JSONObject로 꾸역꾸역 만들어는 냈으나.. 왠지 지저분한 느낌이 들었다.(해당 소스는 너무 지저분해서 생략....)


결국 R에서 직접 DataSet을 JSON으로 변환해주는 방법을 찾아보았으나... 검색을 해봐도... 죄다 영어고.. 자료도 없고 그렇다고 R 코딩을 할 수 도 없고 좌절하고 있었으나... 우연히 정말 우연히도 방법을 찾게 되었다.

(해당 변환함수의 출처를 잃어버렸음... @.@;;)


변환용 함수

> toJSONarray <- function(f){ + clnms <- colnames(f) + + name.value <- function(i){ + quote <- ''; + if(class(f[, i])!='numeric'){ + quote <- '"'; + } + + paste('"', i, '" : ', quote, f[,i], quote, sep='') + } + + objs <- apply(sapply(clnms, name.value), 1, function(x){paste(x, collapse=', ')}) + objs <- paste('{', objs, '}') + + res <- paste('[', paste(objs, collapse=', '), ']') + + return(res) + }


해당함수 실행

> toJSONarray(iris);


실행결과

[1] "[ { \"Sepal.Length\" : 5.1, \"Sepal.Width\" : 3.5, \"Petal.Length\" : 1.4, \"Petal.Width\" : 0.2, \"Species\" : \"setosa\" }, { \"Sepal.Length\" : 4.9, \"Sepal.Width\" : 3, \"Petal.Length\" : 1.4, \"Petal.Width\" : 0.2, \"Species\" : \"setosa\" }, ..생략..


대다나다.. 이로써 무식한 변환소스는 쓰레기통으로...


JRI을 이용하여 연계한 모습(rJava 소스는 생략...)


'R' 카테고리의 다른 글

R을 이용한 중심극한정리  (3) 2013.08.02
rChart  (0) 2013.06.13
JRI Java R Interface  (12) 2013.05.23