在R中解析嵌套父子JSON并提取关联信息及实现可视化
解决JSON数据遍历与可视化问题
一、提取并整理嵌套JSON数据
你已经知道如何获取单个数据项,但面对不同数量的孩子集合,手动遍历太麻烦。我们可以用tidyverse系列包(配合你已经在用的jsonlite)来自动展开嵌套结构,快速生成扁平表格:
步骤1:加载所需包
library(jsonlite) library(tidyverse) # 包含dplyr、tidyr、purrr等工具包,专门处理数据整理
步骤2:读取JSON数据
es <- fromJSON("./json_example2.json")
步骤3:展开嵌套的父母与孩子数据
# 先把parents的命名列表(p1/p2/p3)转成每行对应一个父母的格式 parents_df <- es$parents %>% enframe(name = "parentID", value = "parent_data") %>% # 将p1/p2/p3作为parentID列 unnest_wider(parent_data) # 展开父母的性别、姓名、孩子列表 # 再把每个父母的孩子列表展开成每行对应一个孩子,同时保留父母信息 kids_df <- parents_df %>% unnest_longer(kids, indices_to = "kid_order") %>% # 把孩子列表拆成多行,保留孩子序号 unnest_wider(kids) # 展开每个孩子的姓名、性别、年龄 # 整理成你需要的列顺序和命名 final_df <- kids_df %>% select(name, gender, age, parentGender, parentName, parentID) %>% rename(id = parentID) # 对应你示例里最后一列的p1/p2/p3
步骤4:查看或导出结果
运行后final_df就是你要的结构化表格,你可以直接打印查看,或者导出成逗号分隔的文本:
# 打印结果 print(final_df) # 导出为CSV文件(和你示例格式一致) write.table(final_df, "kids_parents_data.csv", sep = ",", row.names = FALSE, quote = FALSE)
这样就不用手动遍历每个p1$kids$1这种嵌套项了,不管每个父母有多少个孩子,代码都能自动处理。
二、基于条件实现可视化
推荐用ggplot2(已经包含在tidyverse里)来实现条件可视化,它语法灵活,能轻松生成各种图表,而且和我们整理的表格数据适配性极强。
先处理数据类型
首先把age列从字符型转成数值型,方便后续条件判断:
final_df <- final_df %>% mutate(age = as.numeric(age))
1. 性别为"M"且年龄>10的柱状图
假设你要的X是孩子姓名,Y是年龄,代码如下:
# 筛选符合条件的数据 male_over10 <- final_df %>% filter(gender == "M", age > 10) # 生成柱状图 ggplot(male_over10, aes(x = name, y = age)) + geom_bar(stat = "identity", fill = "steelblue") + labs(title = "男性孩子(年龄>10)", x = "孩子姓名", y = "年龄") + theme_minimal()
2. 性别为"F"且年龄<10的饼图
假设你要展示每个符合条件的孩子的年龄占比,代码如下:
# 筛选符合条件的数据 female_under10 <- final_df %>% filter(gender == "F", age < 10) # 生成饼图 ggplot(female_under10, aes(x = "", y = age, fill = name)) + geom_bar(stat = "identity", width = 1) + coord_polar("y", start = 0) + # 转成饼图 labs(title = "女性孩子(年龄<10)", fill = "孩子姓名") + theme_void() # 去掉多余的坐标轴和背景
自动判断条件并生成图表
如果你想让代码自动检查数据是否符合条件,再生成对应图表,可以写一个简单的函数:
plot_by_condition <- function(data) { # 处理男性>10的情况 male_data <- data %>% filter(gender == "M", age > 10) if (nrow(male_data) > 0) { bar_plot <- ggplot(male_data, aes(x = name, y = age)) + geom_bar(stat = "identity", fill = "steelblue") + labs(title = "Male Kids Over 10 Years Old", x = "Kid Name", y = "Age") + theme_minimal() print(bar_plot) } else { message("没有符合条件的男性孩子(年龄>10)") } # 处理女性<10的情况 female_data <- data %>% filter(gender == "F", age < 10) if (nrow(female_data) > 0) { pie_plot <- ggplot(female_data, aes(x = "", y = age, fill = name)) + geom_bar(stat = "identity", width = 1) + coord_polar("y", start = 0) + labs(title = "Female Kids Under 10 Years Old", fill = "Kid Name") + theme_void() print(pie_plot) } else { message("没有符合条件的女性孩子(年龄<10)") } } # 调用函数 plot_by_condition(final_df)
这个函数会自动检查数据,如果有符合条件的记录就生成对应图表,没有就提示信息,非常实用。
内容的提问来源于stack exchange,提问作者piokol
相关产品推荐
相关产品推荐

