You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中将Wikitable API返回的JSON转换为规范Dataframe

解决Wikitable API数据转规范DataFrame的问题

问题核心

Wikitable API返回的JSON是嵌套层级结构,直接用as.data.frame()或as_tibble()转换时,会因为表头与行数据的层级嵌套关系,导致行列结构混乱,出现表头混在行数据里的情况。

具体修复方案

1. 先解析并确认JSON结构

先打印数据结构,定位表头和行数据的位置:

json_2 <- content(response_2, "text")
json_new <- fromJSON(json_2)
# 查看JSON层级,确认表头和行数据的存储位置
str(json_new)

Wikitable标准返回结构中,表头一般在query.tables[[1]]$headers,行数据在query.tables[[1]]$rows。

2. 提取表头并重构行数据

基于标准结构,用以下代码提取并转换为规范DataFrame:

# 提取表头名称
col_names <- json_new$query$tables[[1]]$headers$name

# 提取所有行的单元格值,展开嵌套结构
rows_list <- lapply(json_new$query$tables[[1]]$rows, function(row) {
  unlist(row$value, use.names = FALSE)
})

# 转换为DataFrame并设置列名
wiki_nobel <- do.call(rbind, rows_list) %>%
  as.data.frame(stringsAsFactors = FALSE)
colnames(wiki_nobel) <- col_names

3. 处理特殊嵌套单元格

如果部分单元格包含嵌套内容(比如带链接的文本),可以进一步清理:

# 提取嵌套内容中的文本值
wiki_nobel <- wiki_nobel %>%
  mutate(across(everything(), function(x) {
    if (is.list(x)) x$text else x
  }))

4. 修正你原代码的语法错误

你之前的代码存在两处问题:重复调用fromJSON(json_2),且bind_rows缺少闭合括号,修正后的基础解析代码:

json_2 <- content(response_2, "text")
json_new <- fromJSON(json_2)
# 避免重复解析,减少不必要的内存占用

验证结果

处理完成后,用head(wiki_nobel)查看前几行数据,确认列名与行值对应正确。

内容的提问来源于stack exchange,提问作者Anu421

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:30:41