如何在R中抓取含跨多行列的复杂系谱表(pedigree chart)?
解决系谱表HTML抓取与结构转换问题
步骤1:放弃自动表格解析,手动提取单元格内容
常规的html_table()会因为HTML里混乱的colspan/rowspan属性导致解析结果重复、结构混乱,所以直接提取所有<td>元素的文本并清理:
library(rvest) library(stringr) library(dplyr) # 替换为目标页面的URL或本地HTML路径 page <- read_html("你的目标页面地址") # 提取所有表格单元格文本,清理冗余空格与空内容 cells <- page %>% html_nodes("#PedigreeTable td") %>% html_text() %>% str_squish() %>% filter(. != "")
步骤2:分析系谱表的层级映射规律
从你描述的结构来看,这个系谱表是层级化布局:顶层个体(如Betty)在最上方,其父母(Jack、Sue)分布在后续行的对应位置,再往下是祖父母、曾祖父母层级,每个层级的个体数量是上一层的2倍。
根据你提供的内容,核心关系为:
- Betty → 父亲Jack、母亲Sue
- Jack → 父亲Bo、母亲Bob
- Sue → 父亲Owen、母亲Jacob
- Jim → 父亲Luca、母亲Blane
- 附带个体:Dan(b 1932)、Ava(b 1947)
步骤3:构建规范的亲属关系DataFrame
手动映射(适合小型系谱)
如果系谱规模不大,直接按关系手动构建:
pedigree_df <- tibble( person = c("Betty", "Jack", "Sue", "Bo", "Bob", "Owen", "Jacob", "Jim", "Dan", "Ava"), father = c("Jack", "Bo", "Owen", NA, NA, NA, NA, "Luca", NA, NA), mother = c("Sue", "Bob", "Jacob", NA, NA, NA, NA, "Blane", NA, NA), birth_year = c(NA, NA, 1940, NA, NA, NA, NA, NA, 1932, 1947) )
自动匹配逻辑(适合大型系谱)
如果系谱是标准层级布局,可通过索引自动关联亲属关系:
# 按层级划分单元格(根据实际结构调整索引范围) levels <- list( level1 = cells[1], # 顶层个体:Betty level2 = cells[2:3], # 父母层:Jack、Sue level3 = cells[4:7], # 祖父母层:Bo、Bob、Owen、Jacob level4 = cells[8:11], # 曾祖父母层:Jim、Dan、Luca、Blane others = cells[12] # 其他个体:Ava ) # 逐层构建亲属关系 pedigree_df <- bind_rows( # 顶层个体与父母 tibble( person = levels$level1, father = levels$level2[1], mother = levels$level2[2] ), # 父母与祖父母 tibble( person = levels$level2, father = levels$level3[c(1,3)], mother = levels$level3[c(2,4)] ), # 祖父母与曾祖父母(根据实际数据调整匹配逻辑) tibble( person = levels$level3, father = levels$level4[c(1,2,3,4)], mother = NA ), # 剩余个体 tibble( person = c(levels$level4, levels$others), father = NA, mother = NA ) ) %>% # 分离出生年份与姓名 mutate( birth_year = str_extract(person, "\\d{4}"), person = str_remove(person, " b \\d{4}") )
步骤4:验证与调整
运行后检查DataFrame是否符合预期,若单元格顺序或层级关系与假设不符,仅需调整levels中的索引范围或匹配逻辑即可。
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

