2014-01-14 2 views
1

Я хочу, чтобы преобразовать JSON-файл в dataframe в R. С помощью следующего кода:Невозможно преобразовать JSON в dataframe

link <- 'https://www.dropbox.com/s/ckfn1fpkcix1ccu/bevingenbag.json' 
document <- fromJSON(file = link, method = 'C') 
bev <- do.call("cbind", document) 

я получаю это:

type    features 
1 FeatureCollection list(type = "Feature", geometry = list(type = "Point", coordinates = c(6.54800000288927, 52.9920000044505)), properties = list(gid = "1496600", yymmdd = "19861226", lat = "52.992", lon = "6.548", mag = "2.8", depth = "1.0", knmilocatie = "Assen", baglocatie = "Assen", tijd = "74751")) 

который первая строка матрицы. Все остальные строки имеют одинаковую структуру. Меня интересует часть properties = list(gid = "1496600", yymmdd = "19861226", lat = "52.992", lon = "6.548", mag = "2.8", depth = "1.0", knmilocatie = "Assen", baglocatie = "Assen", tijd = "74751"), которая должна быть преобразована в dataframe со столбцами gid, yymmdd, lat, lon, mag, depth, knmilocatie, baglocatie, tijd.

Я искал и попробовал несколько решений, но ни один из них не работал. Для этого я использовал пакет rjson. Я также попробовал пакет jsonlite RJSONIO &, но не смог извлечь нужную информацию.

Кто-нибудь знает, как решить эту проблему?

+1

Просьба представить воспроизводимый пример. –

+0

Какой пакет вы используете? 'RJSONIO''' 'rjson'? –

+1

Имеет ли [это] (http://stackoverflow.com/questions/21091389/how-to-convert-json-file-into-dataframe-in-r) ответ на ваш вопрос? – jlhoward

ответ

4

Вот способ, чтобы получить кадр данных:

library(rjson) 
document <- fromJSON(file = "bevingenbag.json", method = 'C') 

dat <- do.call(rbind, lapply(document$features, 
          function(x) data.frame(x$properties))) 

Редактировать: Как заменить пустые значения с NA:

dat$baglocatie[dat$baglocatie == ""] <- NA 

Результат:

head(dat) 

     gid yymmdd lat lon mag depth knmilocatie baglocatie tijd 
1 1496600 19861226 52.992 6.548 2.8 1.0  Assen  Assen 74751 
2 1496601 19871214 52.928 6.552 2.5 1.5 Hooghalen Hooghalen 204951 
3 1496602 19891201 52.529 4.971 2.7 1.2 Purmerend Kwadijk 200914 
4 1496603 19910215 52.771 6.914 2.2 3.0  Emmen  Emmen 21116 
5 1496604 19910425 52.952 6.575 2.6 3.0 Geelbroek Ekehaar 102631 
6 1496605 19910808 52.965 6.573 2.7 3.0  Eleveld  Assen 40114 
+0

Thanx, он работает :-) Еще один вопрос: некоторые из значений в столбце 'baglocatie' пусты. Как заменить их на NA или значение из 'knmilocatie'? – Jaap

+0

@Jaap См. Обновление. –

4

Это это еще один, очень похожий подход.

@ Подход SvenHohenstein создает на каждом шаге информационный кадр - дорогостоящий процесс. Гораздо быстрее создавать векторы и повторно вводить весь результат в конце. Кроме того, подход Свена делает каждый столбец фактором, который может или не может быть тем, что вы хотите. Подход ниже работает примерно в 200 раз быстрее. Это может быть важно, если вы намереваетесь сделать это несколько раз. Наконец, вам нужно будет преобразовать столбцы lon, lat, mag, and depth в числовые.

library(microbenchmark) 
library(rjson) 

document <- fromJSON(file = "bevingenbag.json", method = 'C') 

json2df.1 <- function(json){ # @SvenHohenstein approach 
    df <- do.call(rbind, lapply(json$features, 
         function(x) data.frame(x$properties, stringsAsFactors=F))) 
    return(df) 
} 

json2df.2 <- function(json){ 
    df <- do.call(rbind,lapply(json[["features"]],function(x){c(x$properties)})) 
    df <- data.frame(apply(result,2,as.character), stringsAsFactors=F) 
    return(df) 
} 

microbenchmark(x<-json2df.1(document), y<-json2df.2(document), times=10) 
# Unit: milliseconds 
#      expr  min   lq  median   uq  max neval 
# x <- json2df.1(document) 2304.34378 2654.95927 2822.73224 2977.75666 3227.30996 10 
# y <- json2df.2(document) 13.44385 15.27091 16.78201 18.53474 19.70797 10 
identical(x,y) 
# [1] TRUE 
+1

Почему нет функции, аналогичной XMLtoDataFrame для JSON (точно так же, как при анализе XML)? – userJT

Смежные вопросы