Как я могу создать простой фрейм данных из вложенного содержимого API формата JSON

Используя файл формата JSON, извлеченный из SeatGeek API, я хотел бы преобразовать данные в фрейм данных. Мне удалось создать фрейм со всеми переменными + данными, используя функцию ниже:

    library(httr)
    library(jsonlite)

    vpg <- GET("https://api.seatgeek.com/2/venues?country=US&per_page=5000&page=1&client_id=NTM2MzE3fDE1NzM4NTExMTAuNzU&client_secret=77264dfa5a0bc99095279fa7b01c223ff994437433c214c8b9a08e6de10fddd6")

    vpgc <- content(vpg)
    vpgcv <- (vpgc$venues)

    json_file <- sapply(vpgcv, function(x) {
      x[sapply(x, is.null)] <- NA
      unlist(x)
      as.data.frame(t(x))
    })

С этого момента я могу создать фрейм данных, используя:

    venues.dataframe <- as.data.frame(t(json_file), flatten = TRUE)

Но мои полученные данные представляют собой фрейм данных с правильным количеством 23 переменных и 5000 строк, но каждая запись представляет собой список, а не просто значение. Как я могу вытащить значение из каждого списка?

Я также попытался извлечь значения, используя таблицы данных в следующем коде:

library(data.table)
data.table::rbindlist(json_file, fill= TRUE)

Но кадр выходных данных проходит почти по диагонали, помещая 1 сохраненную переменную + 22 значения NULL в строку. Хотя все данные находятся здесь, строки 1-23 (и 24-46 и т. д.) должны быть одной строкой.

Какой из этих двух тупиков является самым простым/самым чистым решением для получения желаемого вывода кадра данных [5000 наблюдений в простой форме значений 23 переменных]?


person JMK    schedule 22.11.2019    source источник


Ответы (1)


Ваш URL подключается напрямую к файлу JSON, нет необходимости в функции GET. Библиотека jsonlite может обрабатывать загрузку напрямую.

library(jsonlite)

output<-fromJSON("https://api.seatgeek.com/2/venues?country=US&per_page=5000&page=1&client_id=NTM2MzE3fDE1NzM4NTExMTAuNzU&client_secret=77264dfa5a0bc99095279fa7b01c223ff994437433c214c8b9a08e6de10fddd6")

df<-output$venues

flatdf<-flatten(df)

#remove first column of empty lists
flatdf<-flatdf[,-1]

Переменная «output» представляет собой список кадров данных из объекта JSON. Можно ссылаться, используя «$», чтобы получить интересующую часть.

df имеет несколько встроенных фреймов данных, чтобы сгладить их, используйте функцию flatten из пакета jsonlite.

person Dave2e    schedule 23.11.2019
comment
Спасибо, Дэйв, я ищу плоский фрейм данных со всеми 23 переменными - кажется, фрейм данных из этого извлечения все же будет скорее набором списков. Есть ли простое действие для создания простой структурированной df, которую я ищу? - person JMK; 23.11.2019
comment
@JML, см. редактирование выше, чтобы удалить встроенные фреймы данных. Поскольку первый столбец списков представляет собой просто набор пустых списков, я бы просто удалил этот столбец. - person Dave2e; 23.11.2019