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

基于配对信息重新分组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,需满足:

  1. 只要某初始分组中至少有一个id在另一位点存在配对,就为该组生成对应新分组
  2. 同组内无配对信息的id,若组内其他id存在配对,则归入同一新分组
  3. 若一个alpha分组对应多个beta分组(或反之),需用字母后缀(如1a、1b)区分不同关联组
  4. 仅为存在配对关联的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:51:18