在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
相关产品推荐
相关产品推荐

