from JSON%>% as.data.frame сбой с несколькими уровнями в выбранных данных - PullRequest
0 голосов
/ 05 августа 2020

У меня есть длинный список JSON строк, которые я пытаюсь импортировать и преобразовать во фреймы данных. Как правило, jsonlite::fromJSON работает должным образом, но около 25% моих JSON выдают ошибку:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 1, 47, 2

Я понимаю, что это из-за разных уровней в JSON, но, похоже, он работает без проблем для остальных 75% моих данных, которые имеют аналогичную структуру.

Вот пример, чтобы проиллюстрировать, когда он работает, а когда нет.

Не работает правильно

x1 <- '{\"productCode\":\"DP1.00096.001\",\"sites\":[\"ABBY\",\"BARR\",\"BART\",\"BLAN\",\"BONA\",\"CLBJ\",\"CPER\",\"DCFS\",\"DEJU\",\"DELA\",\"DSNY\",\"GRSM\",\"GUAN\",\"HARV\",\"HEAL\",\"JERC\",\"JORN\",\"KONA\",\"KONZ\",\"LAJA\",\"LENO\",\"MLBS\",\"MOAB\",\"NIWO\",\"NOGP\",\"OAES\",\"ONAQ\",\"ORNL\",\"OSBS\",\"PUUM\",\"RMNP\",\"SCBI\",\"SERC\",\"SJER\",\"SOAP\",\"SRER\",\"STEI\",\"STER\",\"TALL\",\"TEAK\",\"TOOL\",\"TREE\",\"UKFS\",\"UNDE\",\"WOOD\",\"WREF\",\"YELL\"],\"dateRange\":[\"2012-06\",\"2018-07\"],\"documentation\":\"include\",\"packageType\":\"basic\"}'

output1 <- jsonlite::fromJSON(x1)
str(output1)
as.data.frame(output1)

Работает правильно

x2 <- '{\"productCode\":\"DP1.00095.001\",\"sites\":[\"ABBY\",\"BARR\",\"BART\",\"BLAN\",\"BONA\",\"CLBJ\",\"CPER\",\"DCFS\",\"DEJU\",\"DELA\",\"DSNY\",\"GRSM\",\"GUAN\",\"HARV\",\"HEAL\",\"JERC\",\"JORN\",\"KONA\",\"KONZ\",\"LAJA\",\"LENO\",\"MLBS\",\"MOAB\",\"NIWO\",\"NOGP\",\"OAES\",\"ONAQ\",\"ORNL\",\"OSBS\",\"RMNP\",\"SCBI\",\"SERC\",\"SJER\",\"SOAP\",\"SRER\",\"STEI\",\"STER\",\"TALL\",\"TEAK\",\"TOOL\",\"TREE\",\"UKFS\",\"UNDE\",\"WOOD\",\"WREF\",\"YELL\"],\"dateRange\":[\"2019-01\",\"2019-12\"],\"documentation\":\"include\",\"packageType\":\"basic\"}'

output2 <- jsonlite::fromJSON(x2)
str(output2)
as.data.frame(output2)

В обоих примерах JSON имеет несбалансированную структуру. Разница в том, что в x2 JSON может преобразовывать в data.frame, а в x1 вывод JSON - нет. Я не могу найти разницы ни в выводе str, ни в фактической строке JSON, чтобы понять, где и почему он не работает. Структура идентична, и я бы не ожидал, что эта операция потерпит неудачу.

Любая помощь, проливающая свет на то, почему x1 не работает, а x2 работает, будет оценена. Есть ли способ получить x1 в рабочий фрейм данных, аналогичный выводу x2?

1 Ответ

2 голосов
/ 06 августа 2020

Это не имеет ничего общего с json как таковым. Это связано с тем, что вы пытаетесь переработать векторы нечетной и четной длины. Например:

as.data.frame(list(a = 1, b = 1:2, c = 3:5))
#> Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, 
#> : arguments imply differing number of rows: 1, 2, 3

as.data.frame(list(a = 1, b = 1:2, c = 3:6))
#>   a b c
#> 1 1 1 3
#> 2 1 2 4
#> 3 1 1 5
#> 4 1 2 6

Решением вашей проблемы в случае output1 будет добавление случайной строки в конец output1$sites:

output1$sites <- c(output1$sites, "")

head(as.data.frame(output1))
#>     productCode sites dateRange documentation packageType
#> 1 DP1.00096.001  ABBY   2012-06       include       basic
#> 2 DP1.00096.001  BARR   2018-07       include       basic
#> 3 DP1.00096.001  BART   2012-06       include       basic
#> 4 DP1.00096.001  BLAN   2018-07       include       basic
#> 5 DP1.00096.001  BONA   2012-06       include       basic
#> 6 DP1.00096.001  CLBJ   2018-07       include       basic

Будет ли это На самом деле имеет смысл иметь ваши данные в этом формате, это совсем не ясно из вопроса.

Создано 05.08.2020 с помощью пакета (v0.3.0)

...