将json转换为R中的数据帧

问题描述 投票:0回答:1

我意识到Stack Overflow上有几个问题已经问过类似的问题,但我似乎无法将它们应用到我的具体问题中。我正在尝试将以下json格式的数据转换为数据框。此数据来自以下站点的scart kickstarter数据: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,chosen_currency,thumb,small,medium,web.user,api.user。最后两个变量实际上并不需要.user。 “id”应该有704877813作为它的数据,名称应该是Wellmi,is_registered应该是null或NA等。数据中有两个较大的部分,一个称为“avatar”,另一个称为“urls”,其中“avatar”部分包括thumb,small和medium变量,url部分包括web.user和api.user变量。

r json tibble
1个回答
1
投票

不确定map_if使用的必要性,但您可以使用unnest将列表列转换为标准向量。如果列表cols以不同的维度结束,则此方法将不起作用。在这种情况下,您应该直接提取您需要的内容。

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…

reprex package创建于2018-12-27(v0.2.1)

© www.soinside.com 2019 - 2024. All rights reserved.