R语言中如何将rjson提取的异构列表转为指定结构data.frame
嵌套列表转指定格式data.frame的解决方案
嘿,这事儿不难,我来一步步教你把从JSON提取的特殊嵌套列表转成以x值为行名、y值为列名的data.frame!
首先,先模拟一下你提到的嵌套列表结构(毕竟你没给具体数据,我先造个示例方便演示):
library(rjson) # 模拟从JSON解析得到的嵌套列表 json_str <- '[{"x": "x1", "values": [{"y": "y1", "value": 10}, {"y": "y2", "value": 20}]}, {"x": "x2", "values": [{"y": "y1", "value": 15}, {"y": "y2", "value": 25}]}, {"x": "x3", "values": [{"y": "y1", "value": 8}, {"y": "y3", "value": 30}]}]' my_nested_list <- fromJSON(json_str)
接下来分两步处理:
第一步:把嵌套列表展平成长格式数据框
这一步是把深层嵌套的取值都提取出来,变成x、y、value三列的长表。你可以用tidyverse工具包,也可以用基础R实现:
方法1:用tidyverse(更简洁)
library(purrr) library(dplyr) # 逐层解析嵌套列表,生成长格式data.frame long_df <- map_df(my_nested_list, function(x_group) { # 遍历每个x对应的子列表,提取y和value map_df(x_group$values, function(y_item) { tibble(x = x_group$x, y = y_item$y, value = y_item$value) }) })
方法2:基础R版本(不需要额外包)
# 用嵌套的lapply+do.call展平列表 long_df <- do.call(rbind, lapply(my_nested_list, function(x_group) { do.call(rbind, lapply(x_group$values, function(y_item) { data.frame(x = x_group$x, y = y_item$y, value = y_item$value, stringsAsFactors = FALSE) })) }))
第二步:转换为宽格式,设置行名列名
把长格式转成你要的宽格式,同时把x值设为行名,y值设为列名:
方法1:用tidyr的pivot_wider(推荐)
library(tidyr) # 转宽格式,然后把x列转成行名 wide_df <- long_df %>% pivot_wider(names_from = y, values_from = value) %>% column_to_rownames(var = "x")
方法2:基础R的reshape函数
# 基础R的reshape转换 wide_df <- reshape(long_df, idvar = "x", timevar = "y", direction = "wide") # 设置行名为x的值 rownames(wide_df) <- wide_df$x # 删掉多余的x列,并重命名列名(去掉前面的value.前缀) wide_df$x <- NULL colnames(wide_df) <- sub("value\\.", "", colnames(wide_df))
处理完之后,wide_df就是你想要的结构啦!如果有缺失的x-y组合,会自动填充NA,完全不影响后续绘制折线图。
内容的提问来源于stack exchange,提问作者Erkethan
相关产品推荐
相关产品推荐

