2013-06-05 12 views
28

R과 함께 사용하고자하는 1500 개가 넘는 json 개체가 포함 된 파일이 있습니다. 데이터를 목록으로 가져올 수 있었지만 문제를 해결하는 데 어려움이 있습니다. 유용한 구조. 각 json 객체에 대한 행과 각 키에 대한 열, 값 쌍을 포함하는 데이터 프레임을 만들고 싶습니다.가져온 json 데이터를 데이터 프레임으로 가져 오기

나는이 작은 가짜 데이터 세트 내 상황을 재현했습니다 : 데이터의

[{"name":"Doe, John","group":"Red","age (y)":24,"height (cm)":182,"wieght (kg)":74.8,"score":null}, 
{"name":"Doe, Jane","group":"Green","age (y)":30,"height (cm)":170,"wieght (kg)":70.1,"score":500}, 
{"name":"Smith, Joan","group":"Yellow","age (y)":41,"height (cm)":169,"wieght (kg)":60,"score":null}, 
{"name":"Brown, Sam","group":"Green","age (y)":22,"height (cm)":183,"wieght (kg)":75,"score":865}, 
{"name":"Jones, Larry","group":"Green","age (y)":31,"height (cm)":178,"wieght (kg)":83.9,"score":221}, 
{"name":"Murray, Seth","group":"Red","age (y)":35,"height (cm)":172,"wieght (kg)":76.2,"score":413}, 
{"name":"Doe, Jane","group":"Yellow","age (y)":22,"height (cm)":164,"wieght (kg)":68,"score":902}] 

일부 기능 : 모든 키의 같은 수

  • 객체 : 값 쌍 있지만, 일부 값은 null입니다.
  • 개체 당 두 개의 숫자가 아닌 열 (이름 및 그룹)이 있습니다.
  • name은 고유 식별자입니다 예, 10 개 정도의 그룹이 있습니다.
  • 많은 이름과 그룹 엔트리에는 공백, 쉼표 및 기타 구두점이 포함되어 있습니다. 이 질문을 바탕으로

: R list(structure(list())) to data frame, 나는 시도 다음

Error in data.frame(name = "Doe, John", group = "Red", `age (y)` = 24, : 
    arguments imply differing number of rows: 1, 0 

답변

38

: 내 실제 데이터와이 가짜 데이터를 모두와

json_file <- "test.json" 
json_data <- fromJSON(json_file) 
asFrame <- do.call("rbind.fill", lapply(json_data, as.data.frame)) 

것은, 마지막 줄 날이 오류를 줄 NULL을 NAs로 바꾸면됩니다.

require(RJSONIO)  

json_file <- '[{"name":"Doe, John","group":"Red","age (y)":24,"height (cm)":182,"wieght (kg)":74.8,"score":null}, 
    {"name":"Doe, Jane","group":"Green","age (y)":30,"height (cm)":170,"wieght (kg)":70.1,"score":500}, 
    {"name":"Smith, Joan","group":"Yellow","age (y)":41,"height (cm)":169,"wieght (kg)":60,"score":null}, 
    {"name":"Brown, Sam","group":"Green","age (y)":22,"height (cm)":183,"wieght (kg)":75,"score":865}, 
    {"name":"Jones, Larry","group":"Green","age (y)":31,"height (cm)":178,"wieght (kg)":83.9,"score":221}, 
    {"name":"Murray, Seth","group":"Red","age (y)":35,"height (cm)":172,"wieght (kg)":76.2,"score":413}, 
    {"name":"Doe, Jane","group":"Yellow","age (y)":22,"height (cm)":164,"wieght (kg)":68,"score":902}]' 


json_file <- fromJSON(json_file) 

json_file <- lapply(json_file, function(x) { 
    x[sapply(x, is.null)] <- NA 
    unlist(x) 
}) 
do.call("rbind", json_file) 
    name   group age (y) height (cm) wieght (kg) score 
[1,] "Doe, John" "Red" "24" "182"  "74.8"  NA 
[2,] "Doe, Jane" "Green" "30" "170"  "70.1"  "500" 
[3,] "Smith, Joan" "Yellow" "41" "169"  "60"  NA 
[4,] "Brown, Sam" "Green" "22" "183"  "75"  "865" 
[5,] "Jones, Larry" "Green" "31" "178"  "83.9"  "221" 
[6,] "Murray, Seth" "Red" "35" "172"  "76.2"  "413" 
[7,] "Doe, Jane" "Yellow" "22" "164"  "68"  "902" 
+3

나는이 작업을 수행하는 더 좋은 기능이 없다는 것을 놀랜다로 JSON 데이터를로드하려면이 옵션을 시도 할 수 있습니다. (XML의 경우 XMLtoDataFrame과 같은 함수가 있으므로) JSONtoDataFrame은 매우 유용 할 것입니다. – userJT

+1

@userJT -'jsonlite :: fromJSON'이 있습니다 - NULL을 처리하고'data.frame'으로 단순화합니다. [내 대답] (http://stackoverflow.com/a/37739735/5977215) – SymbolixAU

+0

이 json_file 데이터 프레임이 아닌 매트릭스로 변환 참조하십시오. data.frame을 얻으려면 어떻게해야합니까? – TSR

-2

하는 null 값이 될 이뤄져

json_data <- fromJSON(json_file, nullValue = NA) 
asFrame <- do.call("rbind.fill", lapply(json_data, as.data.frame)) 

이 방법이 매개 변수에 nullValue를 사용하여 제거하려면 : 당신은 각 요소에 대해 널 (NULL)이 아닌 값이 있으면, 오류를받지 않고 rbind를 호출 할 수 있습니다 당신이 library(jsonlite) 및 기능 fromJSON을 사용할 경우 출력

2
dplyr::bind_rows(fromJSON(file_name)) 
+0

은 무엇입니까? 'jsonlite'에서 온 것이면,'dplyr :: bind_rows'는 중복됩니다. 'rjson'에서 나온 것이면 제공된 데이터에 solutino 오류가 있습니다. – SymbolixAU

+0

기억하지 못합니다. 모든 것이 바뀌어야합니다. –

15

에서 불필요한 인용이 매우 간단합니다. 또한 null 값을 처리하고이를 NA으로 변환합니다.

json_file <- '[{"name":"Doe, John","group":"Red","age (y)":24,"height (cm)":182,"wieght (kg)":74.8,"score":null}, 
    {"name":"Doe, Jane","group":"Green","age (y)":30,"height (cm)":170,"wieght (kg)":70.1,"score":500}, 
{"name":"Smith, Joan","group":"Yellow","age (y)":41,"height (cm)":169,"wieght (kg)":60,"score":null}, 
{"name":"Brown, Sam","group":"Green","age (y)":22,"height (cm)":183,"wieght (kg)":75,"score":865}, 
{"name":"Jones, Larry","group":"Green","age (y)":31,"height (cm)":178,"wieght (kg)":83.9,"score":221}, 
{"name":"Murray, Seth","group":"Red","age (y)":35,"height (cm)":172,"wieght (kg)":76.2,"score":413}, 
{"name":"Doe, Jane","group":"Yellow","age (y)":22,"height (cm)":164,"wieght (kg)":68,"score":902}]' 

library(jsonlite) 
fromJSON(json_file) 
#   name group age (y) height (cm) wieght (kg) score 
# 1 Doe, John Red  24   182  74.8 NA 
# 2 Doe, Jane Green  30   170  70.1 500 
# 3 Smith, Joan Yellow  41   169  60.0 NA 
# 4 Brown, Sam Green  22   183  75.0 865 
# 5 Jones, Larry Green  31   178  83.9 221 
# 6 Murray, Seth Red  35   172  76.2 413 
# 7 Doe, Jane Yellow  22   164  68.0 902 

str(fromJSON(json_file)) 
# 'data.frame': 7 obs. of 6 variables: 
# $ name  : chr "Doe, John" "Doe, Jane" "Smith, Joan" "Brown, Sam" ... 
# $ group  : chr "Red" "Green" "Yellow" "Green" ... 
# $ age (y) : int 24 30 41 22 31 35 22 
# $ height (cm): int 182 170 169 183 178 172 164 
# $ wieght (kg): num 74.8 70.1 60 75 83.9 76.2 68 
# $ score  : int NA 500 NA 865 221 413 902 
+0

정확한 코드를 실행했지만,'fromJSON'을 실행하면 데이터 프레임이 아닌리스트를 반환합니다. 데이터 프레임을 어떻게 반환 했습니까? – Alexander

+0

@Alexander - 나는 아직도'data.frame'을 얻습니다. 'jsonlite :: fromJSON'을 사용하고 있는지 확인하십시오. – SymbolixAU

3
library(rjson) 
Lines <- readLines("yelp_academic_dataset_business.json") 
business <- as.data.frame(t(sapply(Lines, fromJSON))) 

당신은 R