2013-04-29 4 views
1

작업하고자하는 데이터가 들어있는 json 데이터 파일이 있습니다. 그것은 그런 일 같습니다 나는 패키지 rjson 및 RJSONIO가 읽어 (지금까지, 그들은 동일한 결과를 제공)를 사용목록 배열을 표로 변환

[ 
{"key1":1,"key2":2,"key3":[123],"key4":{"345":1}}, 
{"key1":2,"key2":4,"key3":[246],"key4":{"980":2},"key5":50} 
] 

을, 여기에 내가 가진 무엇 :

> json_file = "~/Documents/test.json" 
> test_json = fromJSON(paste(readLines(json_file, warn = FALSE), collapse = "")) 
> test_json 
[[1]] 
[[1]]$key1 
[1] 1 

[[1]]$key2 
[1] 2 

[[1]]$key3 
[1] 123 

[[1]]$key4 
345 
    1 


[[2]] 
[[2]]$key1 
[1] 2 

[[2]]$key2 
[1] 4 

[[2]]$key3 
[1] 246 

[[2]]$key4 
980 
    2 

[[2]]$key5 
[1] 50 

> summary(test_json) 
    Length Class Mode 
[1,] 4  -none- list 
[2,] 5  -none- list 

을 그래서, 이것을 이해하는 경우 정확하게, 나는 일련의 목록을 가지고있다. 그러나이 배열은 분명히 동일한 키를 가지고 있으므로 대신 테이블로 변환하려고합니다. 그래서 test_json $ key1과 같은 일을 할 수 있습니다. 이것을 어떻게 할 수 있습니까?

(내가 뭘 하려는지 명확히하기를 바란다. 나는 R에 매우 익숙하며, 모든 것에 대한 올바른 용어를 모르고있다. 나는이 일을 해달라고 간청하지 않는다. 나를 위해,하지만 거기에 그런 상황에 대한 내장 함수가있을 수 있다고 생각하거나 그렇지 않은 경우, 어떤 방향으로 움직여야하는지에 대한 조언이 좋을 것 같습니다.)

답변

1

사실, 목록의 목록입니다. (R 배열은 다차원 행렬입니다.) 그리고 실제로 테이블은 특정한 것을 의미합니다 (?table 참조). 원하는 것은 데이터 프레임입니다.

첫 번째 단계로, 시도 : 당신에게 데이터 프레임의 목록을 제공합니다

lapply(test_json,as.data.frame) 
[[1]] 
    key1 key2 key3 X345 
1 1 2 123 1 

[[2]] 
    key1 key2 key3 X980 key5 
1 2 4 246 2 50 

합니다. 그러나이 시점에서 당신은 작은 문제가 있습니다. 데이터 프레임은 각각 다른 수의 열을가집니다. 모두 동일한 열이있는 경우 간단하게 수행 할 수 있습니다.

do.call(rbind,lapply(test_json,as.data.frame)) 

그리고 큰 데이터 프레임을 다시 얻을 수 있습니다. 또 다른 방법으로는, plyr 패키지 rbind.fill을 사용할 수 있습니다 : 필요에 따라 NA와 누락 된 값을 채울 것입니다

do.call(rbind.fill,lapply(test_json,as.data.frame)) 
    key1 key2 key3 X345 X980 key5 
1 1 2 123 1 NA NA 
2 2 4 246 NA 2 50 

합니다.

rjson을 사용하여 예제를 읽으 려했을 때 뭔가 이상한 점이 있다고 덧붙여 야합니다. 나는 약간의 왜곡 열이 끝났다하더라도, (편집 그래가, RJSONIO으로 시도하고 당신의 출력을 일치. 분명히 그들은 가끔 차이가 할 .) 이유는 모르겠지만, 내 대답은 여전히 ​​적용해야합니다.

+0

고마워, 정확히 내가 원했던 것처럼 보인다! 유일한 차이점은 gtools 패키지의 smartbind 함수가 내 필요에 더 잘 맞았다는 점입니다. –