首页 > 解决方案 > r 将 httr GET 响应解析为单个数据帧

问题描述

我无法将 GET 命令的响应解析为我想要的响应。目标是获取一个数据框,其中包含 GET 返回的每一列的列。生成响应的代码如下,除了wosliteKey. RDS 形式的响应数据在此处。这是一个 16k 的文件。我试过dput了,但它太大了,无法粘贴到这个文本区域。

count <- 100
url <- 'https://api.clarivate.com/api/woslite/'
query <- 'ts=(land AND ocean AND climate AND change AND food security) AND PY=2013-2019'
response <- httr::GET(url, httr::add_headers(accept = 'application/json', `X-APIKey` = wosliteKey),  query = list(databaseId = 'WOK', usrQuery = query, count = count, firstRecord = firstRecord))

我使用以下两个命令将响应转换为 json 类型文件

jsonRespText <- content(response, "text") 
  j <- fromJSON(jsonRespText)

这会产生一个包含一些复杂元素的数据框。这是来自 的输出str(j, max.level = 3)。数据的几个元素是嵌套数据框,其列是列表。

我希望嵌套数据框的所有列都是单个数据框中的列。所有列都是字符。

使用jData <- as.data.table(flatten(j$Data)) 我得到一个 27 列的数据表。但每一列都是一个列表。

List of 2
 $ QueryResult:List of 3
  ..$ QueryID        : int 2
  ..$ RecordsSearched: int 71811425
  ..$ RecordsFound   : int 66
 $ Data       :'data.frame':    66 obs. of  7 variables:
  ..$ Keyword:'data.frame': 66 obs. of  1 variable:
  .. ..$ Keywords:List of 66
  ..$ Title  :'data.frame': 66 obs. of  1 variable:
  .. ..$ Title:List of 66
  ..$ Doctype:'data.frame': 66 obs. of  1 variable:
  .. ..$ Doctype:List of 66
  ..$ Author :'data.frame': 66 obs. of  2 variables:
  .. ..$ Authors         :List of 66
  .. ..$ BookGroupAuthors:List of 66
  ..$ Source :'data.frame': 66 obs. of  9 variables:
  .. ..$ Pages               :List of 66
  .. ..$ SupplementNumber    :List of 66
  .. ..$ SourceTitle         :List of 66
  .. ..$ SpecialIssue        :List of 66
  .. ..$ Volume              :List of 66
  .. ..$ Published.BiblioDate:List of 66
  .. ..$ Published.BiblioYear:List of 66
  .. ..$ Issue               :List of 66
  .. ..$ BookSeriesTitle     :List of 66
  ..$ UT     : chr [1:66] "WOS:000317372700003" "WOS:000367881500035" "WOS:000399397700046" "WOS:000419351000013" ...
  ..$ Other  :'data.frame': 66 obs. of  12 variables:
  .. ..$ Identifier.Eissn                      :List of 66
  .. ..$ Contributor.ResearcherID.Names        :List of 66
  .. ..$ Contributor.ResearcherID.ResearcherIDs:List of 66
  .. ..$ Identifier.Doi                        :List of 66
  .. ..$ Identifier.Issn                       :List of 66
  .. ..$ ResearcherID.Disclaimer               :List of 66
  .. ..$ Identifier.Ids                        :List of 66
  .. ..$ Identifier.article_no                 :List of 66
  .. ..$ Identifier.Eisbn                      :List of 66
  .. ..$ Identifier.Isbn                       :List of 66
  .. ..$ Identifier.Parent_Book_Doi            :List of 66
  .. ..$ Identifier.Xref_Doi                   :List of 66

我可以将这些列表转换为字符列

jData[, ] <- lapply(jData[, ], as.character)

但我很紧张,我可能会在此过程中失去一些东西。有一个更好的方法吗?

标签: rjsondata.tablehttr

解决方案


通常从 JSON 中解析的是带有子列表的列表或带有子数据帧的列表。我认为最好的方法和更清晰的方法是使用代码将结果拆分为单独的数据帧。

示例创建一个新的 DATA 表,然后 cbind 关键字、标题和文档类型。然后 cbind authors 和 BookGroupAuthors 等等。我很确定会有更快的速度,但这可以确保您拥有一个大数据框,其中包含从 Json 检索到的所有列。


推荐阅读