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

使用dplyr的mutate结合条件逻辑创建分组变量及扩展需求

解决方案

初始问题修复

你的代码失效的核心原因是:IndividualsObserved是逗号分隔的多个体字符串,但%in%只能判断单个值是否属于目标列表,无法处理多值场景。要解决这个问题,需要先拆分字符串、匹配每个个体的分组,再基于分组集合判断整体类型。

以下是完整的dplyr解决方案:

library(dplyr)
library(tidyr)

# 1. 定义个体-分组映射表(可根据实际情况扩展)
group_map <- tibble(
  Individual_ID = c("Adele", "Fitz", "Abba", "Noir", "Rouge", "Bleue"),
  Group = c(rep("GroupA", 3), rep("GroupB", 3))
)

# 2. 处理数据集生成GroupingID
df_processed <- df %>%
  # 把逗号分隔的个体拆分为单独行
  separate_rows(IndividualsObserved, sep = ",") %>%
  # 匹配每个个体对应的分组
  left_join(group_map, by = c("IndividualsObserved" = "Individual_ID")) %>%
  # 按原数据行聚合,统计当前行存在的有效分组
  group_by(across(-c(IndividualsObserved, Group))) %>%
  summarize(
    unique_groups = unique(na.omit(Group)), # 过滤掉无分组的模糊个体
    .groups = "drop"
  ) %>%
  # 判断分组类型
  mutate(
    GroupingID = case_when(
      length(unique_groups) == 0 ~ "Unknown", # 全为模糊个体的情况
      length(unique_groups) == 1 ~ unique_groups,
      length(unique_groups) == 2 ~ "MixedGrouping"
    )
  )

扩展需求实现

1. 模糊个体处理

上述代码中,na.omit(Group)会自动过滤掉未在映射表中定义的模糊个体(这类个体的Group会是NA),因此它们的存在不会影响分组判断。例如,若某行记录是"Adele,Xyz",最终只会识别到GroupA,不会改变分组结果。

2. 创建GroupDetails列

在mutate步骤中直接扩展逻辑即可:

mutate(
    GroupingID = case_when(
      length(unique_groups) == 0 ~ "Unknown",
      length(unique_groups) == 1 ~ unique_groups,
      length(unique_groups) == 2 ~ "MixedGrouping"
    ),
    GroupDetails = case_when(
      length(unique_groups) == 0 ~ "Unknown",
      length(unique_groups) == 1 ~ unique_groups,
      length(unique_groups) == 2 ~ "GroupA+GroupB"
    )
  )

3. 提取所有个体名称

从3万条数据中提取所有出现过的个体,去重后即可:

all_individuals <- df %>%
  separate_rows(IndividualsObserved, sep = ",") %>%
  pull(IndividualsObserved) %>%
  unique()

# 可选:排序输出
all_individuals_sorted <- sort(all_individuals)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:26:28