来自JSON的jsonlite返回了2个列表而不是df

时间:2016-07-21 21:15:53

标签: json r jsonlite

我跟随FCC's documentation下载了一些有关诉讼的元数据。

我不相信我可以发布数据,但您可以获得免费API key

我的代码会生成列出的2个列表的列表,而不是JSON格式的结构化df。

我的目标是建立一个数据框,其中每个json元素都是它自己的列..就像普通的df一样。

library(httr)
library(jsonlite)

datahere = "C:/fcc/"
setwd(datahere)

URL <- "https://publicapi.fcc.gov/ecfs/filings?api_key=<KEY HERE>&proceedings.name=14-28&sort=date_disseminated,DESC"
dataDF <- GET(URL)
dataJSON <- content(dataDF, as="text")
dataJSON <- fromJSON(dataJSON)

# NAs
dataJSON2 <- lapply(dataJSON, function(x) {
  x[sapply(x, is.null)] <- NA
  unlist(x)
})

x <- do.call("rbind", dataJSON2)
x <- as.data.frame(x)

1 个答案:

答案 0 :(得分:1)

JSON实际上是嵌套的,因此您需要更多地考虑在list和data.frame之间进行转换。下面的逻辑提取了25个文件(102个变量)和10个聚合(25个变量)的data.frame。

# tackle the filings object
filings_df <- ldply(dataJSON$filings, function(x) {
  # removes null list elements
  x[sapply(x, is.null)] <- NA
  # converts to a named character vector
  unlisted_x <- unlist(x)
  # converts the named character vector to data.frame
  # with 1 column and rows for each element
  d <- as.data.frame(unlisted_x)
  # we need to transpose this data.frame because 
  # the rows should be columns, and don't check names when converting
  d <- as.data.frame(t(d), check.names=F)
  # now assign the actual names based on that original 
  # unlisted character vector
  colnames(d) <- names(unlisted_x)
  # now return to ldply function, which will automatically stack them together
  return(d)
})

# tackle the aggregations object
# same exact logic to create the data.frame
aggregations_df <- ldply(dataJSON$aggregations, function(x) {
  # removes null list elements
  x[sapply(x, is.null)] <- NA
  # converts to a named character vector
  unlisted_x <- unlist(x)
  # converts the named character vector to data.frame
  # with 1 column and rows for each element
  d <- as.data.frame(unlisted_x)
  # we need to transpose this data.frame because 
  # the rows should be columns, and don't check names when converting
  d <- as.data.frame(t(d), check.names=F)
  # now assign the actual names based on that original 
  # unlisted character vector
  colnames(d) <- names(unlisted_x)
  # now return to ldply function, which will automatically stack them together
  return(d)
})