Из списка файлов json в data.table: частичный список переменных

У меня есть список из более чем 100 000 файлов json, из которых я хочу получить data.table всего с несколькими переменными. К сожалению, файлы сложны. Содержимое каждого файла json выглядит так:

Образец 1

$id
[1] "10.1"
$title
$title$value
[1] "Why this item"
$itemsource
$itemsource$id
[1] "AA"
$date
[1] "1992-01-01"
$itemType
[1] "art"
$creators
list()

Образец 2

$id
[1] "10.2"
$title
$title$value
[1] "We need this item"
$itemsource
$itemsource$id
[1] "AY"
$date
[1] "1999-01-01"
$itemType
[1] "art"
$creators
    type                name firstname    surname affiliationIds
1 Person Frank W. Cornell.  Frank W. Cornell.             a1
2 Person David A. Chen.  David A. Chen.             a1

$affiliations
  id                                          name
1 a1 Foreign Affairs Desk, New York Times

Из этого набора файлов мне нужна таблица с именами создателей, идентификаторами элементов и датами. Для двух примеров файлов выше:

id           date            name                firstname lastname  creatortype
"10.1"      "1992-01-01"      NA                    NA        NA      NA
"10.2"      "1999-01-01"  Frank W. Cornell.      Frank W.   Cornell.  Person
"10.2"      "1999-01-01"  David A. Chen.         David A.   Chen.     Person

Что я сделал до сих пор:

library(parallel)
library(data.table)
library(jsonlite)
library(dplyr)

filelist = list.files(pattern="*.json",recursive=TRUE,include.dirs =TRUE)
parsed = mclapply(filelist, function(x) fromJSON(x),mc.cores=24)
data = rbindlist(mclapply(1:length(parsed), function(x) { 
  a = data.table(item = parsed[[x]]$id, date = list(list(parsed[[x]]$date)), name = list(list(parsed[[x]]$name)), creatortype = list(list(parsed[[x]]$creatortype))) #ignoring the firstname/lastname fields here for convenience
  b = data.table(id = a$item, date = unlist(a$date), name=unlist(a$name), creatortype=unlist(a$creatortype))
  return(b)
},mc.cores=24))

Однако на последнем шаге я получаю эту ошибку:

"Error in rbindlist(mclapply(1:length(parsed), function(x){:
Item 1 of list is not a data.frame, data.table or list"

Заранее благодарим за ваши предложения. Связанные вопросы включают: Извлечь данные из списка списков [R] R преобразовать json в список в data.table Я хочу преобразовать файл JSON в таблицу данных в r Как читать файлы из каталога с помощью R? Преобразование столбца таблицы данных R из JSON в таблицу данных


person user2627717    schedule 22.04.2017    source источник


Ответы (1)


из сообщения об ошибке, я полагаю, это в основном означает, что один из результатов mclapply () пуст, под пустым я подразумеваю либо NULL, либо data.table с 0 строкой, либо просто обнаруживает ошибку при параллельной обработке.

что вы могли бы сделать, это:

  1. добавьте больше проверок внутри mclapply (), например try-error, или проверьте класс b и nrow of b, независимо от того, пуст ли b или нет

  2. когда вы используете rbindlist, добавьте аргумент fill = T

надеюсь, что это решит вашу проблему.

person sinalpha    schedule 23.04.2017