基于配对信息重新分组R数据框中的元素
基于配对关系生成R数据框的新分组变量
原始数据框
首先定义输入的数据框:
mydf <- data.frame(id=LETTERS, locus=c(rep("alpha",14),rep("beta",12)), group=c(rep(1,2),rep(2,6),rep(3,6),rep(4,4),rep(5,4),rep(6,4)), pair=c(1:12,14,15,3,4,6,8,9:16))
该数据框包含以下字段:
id:唯一主键(A-Z)locus:分为alpha和beta两类位点group:按位点划分的初始分组pair:alpha与beta之间的配对标识(同一pair值表示两者为配对关系)
需求规则
需要生成新分组变量new_group,需满足:
- 只要某初始分组中至少有一个id在另一位点存在配对,就为该组生成对应新分组
- 同组内无配对信息的id,若组内其他id存在配对,则归入同一新分组
- 若一个alpha分组对应多个beta分组(或反之),需用字母后缀(如1a、1b)区分不同关联组
- 仅为存在配对关联的id分配
new_group,无关联的孤儿id保持NA
解决方案代码
使用dplyr包实现分组逻辑:
library(dplyr) # 1. 提取alpha和beta的配对关联分组 alpha_pairs <- mydf %>% filter(locus == "alpha") %>% select(pair, alpha_group = group) beta_pairs <- mydf %>% filter(locus == "beta") %>% select(pair, beta_group = group) # 2. 建立配对分组映射并添加字母后缀区分一对多关联 linked_groups <- inner_join(alpha_pairs, beta_pairs, by = "pair") %>% distinct(alpha_group, beta_group) %>% # 为同一alpha对应的多个beta分组加后缀 group_by(alpha_group) %>% mutate(suffix = letters[row_number()]) %>% ungroup() %>% # 为同一beta对应的多个alpha分组调整后缀 group_by(beta_group) %>% mutate(suffix = ifelse(n() > 1, letters[row_number()], suffix)) %>% ungroup() %>% mutate(new_group = paste0(alpha_group, suffix)) # 3. 将新分组映射回原始数据框 mydf <- mydf %>% # 匹配alpha组的new_group left_join(linked_groups %>% select(alpha_group, new_group), by = c("group" = "alpha_group")) %>% rename(new_group_alpha = new_group) %>% # 匹配beta组的new_group left_join(linked_groups %>% select(beta_group, new_group), by = c("group" = "beta_group")) %>% rename(new_group_beta = new_group) %>% # 合并双向映射结果 mutate(new_group = coalesce(new_group_alpha, new_group_beta)) %>% select(-new_group_alpha, -new_group_beta) %>% # 填充同组内无配对但需归入的id group_by(group) %>% mutate(new_group = ifelse(any(!is.na(new_group)), first(na.omit(new_group)), new_group)) %>% ungroup() # 查看最终结果 mydf %>% select(id, locus, group, pair, new_group)
逻辑说明
- 通过
inner_join筛选出所有存在实际配对的alpha-beta分组对,确保只处理有真实关联的分组 - 针对一对多的分组关联,通过
row_number()生成字母后缀,避免分组标识重复 - 分别为alpha和beta组匹配对应的
new_group,再用coalesce合并双向结果 - 最后通过
group_by将同组内有配对的分组标识填充到组内无配对的id,满足规则2
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

