преобразование JSON в фрейм данных в R - PullRequest
0 голосов
/ 28 декабря 2018

Я понимаю, что есть несколько вопросов о переполнении стека, которые уже задают нечто похожее на это, но я не могу применить их к моей конкретной проблеме.Я пытаюсь преобразовать следующие данные в формате JSON во фрейм данных.Эти данные взяты из данных очищенного кикстартера со следующего сайта: https://webrobots.io/kickstarter-datasets/

"{\"id\":704877813,\"name\":\"Wellmii\",\"is_registered\":null,\"chosen_currency\":null,\"avatar\":{\"thumb\":\"https://ksr-ugc.imgix.net/assets/022/981/694/75c6b5ca6616e3a3adaa295fcef9d318_original.png?ixlib=rb-1.1.0&w=40&h=40&fit=crop&v=1541445663&auto=format&frame=1&q=92&s=872ecbdca14ada8169b88c1794d29591\",\"small\":\"https://ksr-ugc.imgix.net/assets/022/981/694/75c6b5ca6616e3a3adaa295fcef9d318_original.png?ixlib=rb-1.1.0&w=160&h=160&fit=crop&v=1541445663&auto=format&frame=1&q=92&s=99039218188220e2690206b2b508b19f\",\"medium\":\"https://ksr-ugc.imgix.net/assets/022/981/694/75c6b5ca6616e3a3adaa295fcef9d318_original.png?ixlib=rb-1.1.0&w=160&h=160&fit=crop&v=1541445663&auto=format&frame=1&q=92&s=99039218188220e2690206b2b508b19f\"},\"urls\":{\"web\":{\"user\":\"https://www.kickstarter.com/profile/704877813\"},\"api\":{\"user\":\"https://api.kickstarter.com/v1/users/704877813?signature=1544762516.4e88d80e492ef75c79caff24e220b49c87d522c7\"}}}"

Если я применю к данным следующий код, я получу фрейм данных, в котором переменные «web» и «api»tibbles.Я просто хочу данные в обычном фрейме данных.Как я могу получить эти переменные, чтобы быть просто обычными переменными фрейма данных?

df <- data %>%

    # make json, then make list
    fromJSON() %>%

    # remove classification level
    purrr::flatten() %>%

    # turn nested lists into dataframes
    map_if(is_list, as_tibble) %>%

    # bind_cols needs tibbles to be in lists
    map_if(is_tibble, list) %>%

    # creates nested dataframe
    bind_cols()

Фрейм данных должен иметь следующие переменные: id, name, is_registered, selected_currency, thumb, small, medium, web.user, api.user.Последние две переменные действительно не нуждаются в .user в конце их.«id» должен иметь 704877813, так как это данные, имя должно иметь Wellmii, is_registered должен быть нулевым или NA, и т. д. В данных есть два больших раздела, один называется «аватар», а другой - «urls», гдераздел «аватар» включает переменные thumb, small и medium, а раздел urls - переменные web.user и api.user.

1 Ответ

0 голосов
/ 28 декабря 2018

Не уверен насчет необходимости использования map_if, но вы можете использовать unnest, чтобы превратить столбцы списка в стандартные векторы.Этот подход не будет работать, если списочные столбцы будут иметь разные измерения.В этом случае вы должны непосредственно извлечь то, что вам нужно.

library(tidyverse)
library(jsonlite)

data <- "{\"id\":704877813,\"name\":\"Wellmii\",\"is_registered\":null,\"chosen_currency\":null,\"avatar\":{\"thumb\":\"https://ksr-ugc.imgix.net/assets/022/981/694/75c6b5ca6616e3a3adaa295fcef9d318_original.png?ixlib=rb-1.1.0&w=40&h=40&fit=crop&v=1541445663&auto=format&frame=1&q=92&s=872ecbdca14ada8169b88c1794d29591\",\"small\":\"https://ksr-ugc.imgix.net/assets/022/981/694/75c6b5ca6616e3a3adaa295fcef9d318_original.png?ixlib=rb-1.1.0&w=160&h=160&fit=crop&v=1541445663&auto=format&frame=1&q=92&s=99039218188220e2690206b2b508b19f\",\"medium\":\"https://ksr-ugc.imgix.net/assets/022/981/694/75c6b5ca6616e3a3adaa295fcef9d318_original.png?ixlib=rb-1.1.0&w=160&h=160&fit=crop&v=1541445663&auto=format&frame=1&q=92&s=99039218188220e2690206b2b508b19f\"},\"urls\":{\"web\":{\"user\":\"https://www.kickstarter.com/profile/704877813\"},\"api\":{\"user\":\"https://api.kickstarter.com/v1/users/704877813?signature=1544762516.4e88d80e492ef75c79caff24e220b49c87d522c7\"}}}"

data %>%
 fromJSON() %>%
 purrr::flatten() %>%
 bind_rows() %>%
 unnest()

#> # A tibble: 1 x 7
#>        id name   thumb        small       medium       web      api        
#>     <int> <chr>  <chr>        <chr>       <chr>        <chr>    <chr>      
#> 1  7.05e8 Wellm… https://ksr… https://ks… https://ksr… https:/… https://ap…

Создано в 2018-12-27 пакетом Представить (v0.2.1)

...