提取列表中的列表以建立R中的数据帧

时间:2018-08-19 00:27:50

标签: r json dataframe purrr

我正在尝试使用我的个人数据通过LibraryThing api构建一个包含书ID,书名,作者,等级,收录,开始和结束日期的数据框。我可以很容易地得到一个嵌套列表,而且我已经弄清楚了如何用日期以外的所有内容构建数据框(也许不是最好的方法,但是它可以工作)。我的问题是日期。 我正在使用的列表通常包含20个元素,但是只有在我向帐户中的书中添加日期时,它才会添加startfinishdates元素。这导致了两个问题:

  • 如果它始终存在,我可以像提取其他所有东西一样提取它,并且大多数时候它都具有NA,我可以使用cbind使其与其他信息正确对齐
  • 当我使用名称提取它,并得到一个元素较少的对象时,我没有办法将其重新连接到其他所有对象(它没有书号)

最终,我想构建一个数据框,并给出一个答案,该答案告诉我如何取出书ID并将其与每个startfinishdate关联,这样我就可以加入书ID。我只是将其添加到我的代码中。

我也乐于从跳转中学习更好的方法,并重新设计整个事情,因为我在R中的清单工作不多,经过反复试验,我得出的结论是一致的。不过,我确实要使用R,因为最终我将使用它为我的网站创建R Markdown页面(例如,显示书完成日期的图)。

您可以运行下面的代码并获取数据(无需api密钥)。

textarea

2 个答案:

答案 0 :(得分:0)

  

我也愿意学习更好的方法

由于尚不清楚将JSON数据导入R后您希望做什么,因此很难知道可以采用哪些替代方法,但是由于您的数据是JSON,因此您不妨考虑使用面向JSON的工具,例如。尤其是jq使得JSON文档的高效查询和更新变得非常容易。

答案 1 :(得分:0)

此方法不在tidyverse元数据包之外。使用base-R,您可以使用以下代码使其工作。

Map将用户定义的函数应用于参数中提供的data$books的每个元素,并提取data.frame的必填字段。 Reduce将获取所有单个数据帧,并将它们合并(或缩减)为单个data.frame booksdf

library(jsonlite)
data<-fromJSON("http://www.librarything.com/api_getdata.php?userid=cau83&key=392812157&max=450&showCollections=1&responseType=json&showDates=1")

booksdf=Reduce(function(x,y){rbind(x,y)},
    Map(function(x){
lenofelements = length(x)

if(lenofelements>20){
  if(!is.null(x$startfinishdates$started_date)){
      started_date = x$startfinishdates$started_date
  }else{
      started_date=NA
  }

  if(!is.null(x$startfinishdates$started_stamp)){
      started_stamp = x$startfinishdates$started_date
  }else{
      started_stamp=NA
  }

  if(!is.null(x$startfinishdates$finished_date)){
      finished_date = x$startfinishdates$finished_date
  }else{
      finished_date=NA
  }

  if(!is.null(x$startfinishdates$finished_stamp)){
     finished_stamp = x$startfinishdates$finished_stamp
  }else{
     finished_stamp=NA
  }

}else{
    started_stamp = NA
    started_date = NA
    finished_stamp = NA
    finished_date = NA
}
book_id = x$book_id
title = x$title
author = x$author_fl
rating = x$rating
collections = paste(unlist(x$collections),collapse = ",")

return(data.frame(ID=book_id,Title=title,Author=author,Rating=rating,
Collections=collections,Started_date=started_date,Started_stamp=started_stamp,
Finished_date=finished_date,Finished_stamp=finished_stamp))
},data$books))