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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:51