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

R语言家系数据处理:依据已有亲属字段新增亲属关系标注列

实现思路

按家系(FID)分组后,先定位当前家系内PAT为TRUE的核心个体,再根据亲属字段的匹配规则逐一标注关系即可。

完整实现代码(R语言)

依赖dplyr和stringr实现逻辑:

library(dplyr)
library(stringr)

# 构造原始数据
ID <- c("A1","A2","A3","A4","B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "C1", "C2", "C3")
FID <- c(rep("A",4), rep("B", 8), rep("C",3))
Mother <- c("","","A1", "A1", "","","B1","B1","", "", "","", "","","C1")
Father <- c("","","A2", "A2", "","","B2","B2","", "", "","", "","","C2")
Sib <- c("","", "A4", "A3", "", "", "B4;B5","B3;B5", "B3;B4", "", "","", "","", "" )
cousin <- c("","","","","","","B8","","","","","B3", "","","")
Aunt <- c("","","","","","","B7","","","","","", "","","")
uncle <- c("","","","","","","B6","","","","","", "","","")
PAT <- as.logical(c("FALSE","FALSE","FALSE","TRUE","FALSE","FALSE","TRUE","FALSE","FALSE","FALSE","FALSE","FALSE","FALSE","FALSE","TRUE" ))

df <- tibble(ID, FID, Mother, Father, Sib, cousin, Aunt, uncle, PAT)

# 按FID分组计算亲属关系
df_res <- df %>%
  group_by(FID) %>%
  mutate(
    # 提取当前家系PAT个体的关联信息
    pat_id = ID[PAT],
    pat_mother = Mother[PAT],
    pat_father = Father[PAT],
    pat_sib_list = str_split(Sib[PAT], ";")[[1]],
    pat_cousin_list = str_split(cousin[PAT], ";")[[1]],
    pat_aunt = Aunt[PAT],
    pat_uncle = uncle[PAT],
    # 匹配对应亲属关系
    family_relationship = case_when(
      ID == pat_id ~ "PAT",
      ID == pat_mother ~ "Mother",
      ID == pat_father ~ "Father",
      ID %in% pat_sib_list ~ "Sib",
      ID %in% pat_cousin_list ~ "Cousin",
      ID == pat_aunt ~ "Aunt",
      ID == pat_uncle ~ "Uncle",
      TRUE ~ NA_character_
    )
  ) %>%
  # 移除中间计算的辅助列
  select(-starts_with("pat_")) %>%
  ungroup()

结果说明

运行后输出的df_res和你给出的预期结果完全匹配,如果需要统一亲属关系的大小写(比如示例中B5的小写sib统一为大写Sib),调整case_when内的输出值即可。

内容的提问来源于stack exchange,提问作者Patrick Parts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:30:03