2016-02-16 3 views
2
library(rjson) 
filenames <- list.files(pattern="*.json") # gives a character vector, with each file name represented by an entry 

Теперь я хочу импортировать все файлы JSON в R как один единый dataFrame. Как мне это сделать?Чтение нескольких файлов JSON в каталоге в один кадр данных

я впервые попробовал

myJSON <- lapply(filenames, function(x) fromJSON(file=x)) # should return a list in which each element is one of the JSON files 

но выше код занимает по времени, чтобы прекратить, так как у меня 15000 файлов, и я знаю, что это не будет возвращать один кадр данных. Есть ли более быстрый способ сделать это?

Пример JSON файла:

{"Reviews": [{"Ratings": {"Service": "4", "Cleanliness": "5"}, "AuthorLocation": "Boston", "Title": "\u201cExcellent Hotel & Location\u201d", "Author": "gowharr32", "ReviewID": "UR126946257", "Content": "We enjoyed the Best Western Pioneer Square....", "Date": "March 29, 2012"}, {"Ratings": {"Overall": "5"},"AuthorLocation": "Chicago",....},{...},....}]} 
+1

если/когда он возвращается, вы можете вызвать 'do.call (rbind, myJSON)', чтобы получить один файл data.frame при условии совместимости data.frame ... – Jthorpe

+0

образец одного из Файлы JSON помогут вам помочь вам. 'purrr :: map_df' или' purrr :: flatten_df' может помочь. 'pbapply :: pblapply' с' dplyr :: bind_rows' wld дает вам индикатор выполнения, если вы можете получить 'fromJSON', чтобы вернуть' data.frame' – hrbrmstr

ответ

1

Go параллельно через:

library(parallel) 
cl <- makeCluster(detectCores() - 1) 
json_files<-list.files(path ="your/json/path",pattern="*.json",full.names = TRUE) 
json_list<-parLapply(cl,json_files,function(x) rjson::fromJSON(file=x,method = "R")) 
stopCluster(cl) 
1

Для тех, кто ищет purrr/tidyverse решение прийти сюда:

library(purrr) 
library(tidyverse) 
library(jsonlite) 

path <- "./your_path" 
files <- dir(path, pattern = "*.json") 

data <- files %>% 
     map_df(~fromJSON(file.path(path, .), flatten = TRUE)) 
Смежные вопросы