Как я могу распечатать список именованных списков из ответа JSON в R?

Я пишу сценарий на R, который использует веб-API, который возвращает данные в большом массиве сложных объектов JSON, например:

[
    {
        "runIds": [9505160, 89098],
        "fileCount": 2,
        "runTime": 1.469,
        "requestCount": 1
    },
    {
        "runIds": [12, 13, 14],
        "fileCount": 1,
        "runTime": 2.9,
        "requestCount": 10
    }
]

Я использую пакет httr R для выполнения запроса GET, который захватывает эти данные и возвращает их в виде списка списков. Если вы не знакомы с форматом ответа, проверьте вывод этого фиктивного примера R:

library(httr)
response = GET("https://jsonplaceholder.typicode.com/users")
content(response)

Что печатает что-то вроде:

[[10]]$company
[[10]]$company$name
[1] "Hoeger LLC"

[[10]]$company$catchPhrase
[1] "Centralized empowering task-force"

[[10]]$company$bs
[1] "target end-to-end models"
(...)

Печатный ответ трудно читать. Есть ли способ распечатать этот список списков (списков и т. Д.) "Заранее заданным" способом в R?


person DanyAlejandro    schedule 14.08.2019    source источник


Ответы (1)


С пакетом jsonlite вы можете преобразовать его в фрейм данных.

library(httr)

   response = GET("https://jsonplaceholder.typicode.com/users")

   my_json_text <-content(response,as="text") 

library(jsonlite)

   my_df_output <- fromJSON(my_json_text)

   head(my_df_output,2)

который дает,

  id          name  username             email address.street address.suite address.city address.zipcode address.geo.lat address.geo.lng                 phone       website    company.name
1  1 Leanne Graham      Bret [email protected]    Kulas Light      Apt. 556  Gwenborough      92998-3874        -37.3159         81.1496 1-770-736-8031 x56442 hildegard.org Romaguera-Crona
2  2  Ervin Howell Antonette [email protected]  Victor Plains     Suite 879  Wisokyburgh      90566-7771        -43.9509        -34.4618   010-692-6593 x09125 anastasia.net    Deckow-Crist
                     company.catchPhrase                       company.bs
1 Multi-layered client-server neural-net      harness real-time e-markets
2         Proactive didactic contingency synergize scalable supply-chains

РЕДАКТИРОВАТЬ:

Если файл включает список в списках, мы можем сделать то же самое, например,

data <- '[
    {
        "runIds": [9505160, 89098],
        "fileCount": 2,
        "runTime": 1.469,
        "requestCount": 1
    },
    {
        "runIds": [12, 13, 14],
        "fileCount": 1,
        "runTime": 2.9,
        "requestCount": 10
    }
]'

 data2 <- fromJSON(data)

Если мы позвоним data2,

data2
          runIds fileCount runTime requestCount
1 9505160, 89098         2   1.469            1
2     12, 13, 14         1   2.900           10


sapply(data2,class)

      runIds    fileCount      runTime requestCount 
      "list"    "integer"    "numeric"    "integer" 

Это в формате списка. Таким образом, мы можем сохранить его как формат списка внутри нашего фрейма данных, который более предопределен по сравнению с выходом content(), или мы можем предпочесть преобразовать его в чистый фрейм данных:

library(tidyverse)

data2 %>% unnest(runIds)

который дает,

  fileCount runTime requestCount  runIds
1         2   1.469            1 9505160
2         2   1.469            1   89098
3         1   2.900           10      12
4         1   2.900           10      13
5         1   2.900           10      14
person maydin    schedule 15.08.2019
comment
Это почти отвечает на мой вопрос, за исключением того факта, что это может печатать только структуру JSON, глубиной не более 1 уровня (массив элементов). Однако фрейм данных не будет работать в тех случаях, когда ячейка сама по себе является списком, как в приведенном примере JSON. - person DanyAlejandro; 15.08.2019