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
相关产品推荐
相关产品推荐

