r - 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)
但我很紧张,我可能会在此过程中失去一些东西。有一个更好的方法吗?
解决方案
通常从 JSON 中解析的是带有子列表的列表或带有子数据帧的列表。我认为最好的方法和更清晰的方法是使用代码将结果拆分为单独的数据帧。
示例创建一个新的 DATA 表,然后 cbind 关键字、标题和文档类型。然后 cbind authors 和 BookGroupAuthors 等等。我很确定会有更快的速度,但这可以确保您拥有一个大数据框,其中包含从 Json 检索到的所有列。
推荐阅读
- javascript - 如何通过ajax调用在点击jstree最后一个节点时填充数据
- github - Github 部署显示空白
- graphql - 问题在 apollo-graphql 中的突变中传递数组参数
- excel - TEXT 函数中的 $ 符号是什么意思
- marklogic - 元素词位置 - 概念问题
- python - markdown 未正确转换为 html
- css - Bootstrap:CSS 媒体查询不会覆盖原始 CSS
- r - 在 R 中的 cowplot::gridplot 中为子图添加标签
- algorithm - 最大和的动态规划方法
- python - 在 rasterio 中索引 numpy 数组和打开文件之间的权衡