【问题标题】:How can I create a simple dataframe from nested, JSON format API content如何从嵌套的 JSON 格式 API 内容创建一个简单的数据框
【发布时间】:2020-03-19 01:12:30
【问题描述】:

使用从 SeatGeek API 提取的 JSON 格式文件,我想将数据转换为数据框。我已经设法使用以下函数创建了一个包含所有变量 + 数据的框架:

    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 个变量的简单值形式] 的数据框输出的最简单/最干净的解决方案?

【问题讨论】:

    标签: r json dataframe datatable jsonlite


    【解决方案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]
    

    变量“输出”是来自 JSON 对象的数据帧列表。可以使用“$”引用来检索感兴趣的部分。

    df 确实有一些嵌入的数据帧,要展平,请使用 jsonlite 包中的 flatten 函数。

    【讨论】:

    • 谢谢 Dave,我正在寻找一个包含所有 23 个变量的平面数据框——看来来自该拉取的数据框仍将是列表的集合。是否有一个简单的操作来创建我正在寻找的简单结构化 df?
    • @JML,请参阅上面的编辑以删除嵌入的数据框。由于列表的第一列只是空列表的集合,所以我将删除该列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2019-08-04
    • 2019-04-27
    • 2022-10-13
    • 2020-12-22
    • 2020-01-21
    相关资源
    最近更新 更多