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

