在R中基于字符串值将多水平分类变量重分组为5组的方法
高效实现分类变量按关键词分组降维
核心思路
用关键词-分组映射表替代零散的str_detect/grepl判断,既方便维护,又能通过批量匹配提升效率,尤其适合1000+水平的分类变量。
方法1:dplyr + fuzzyjoin(易维护,适合中等数据量)
通过正则匹配批量关联关键词与分组,无需嵌套多层条件判断:
- 定义关键词映射表(可随时调整关键词/分组名称)
library(dplyr) library(fuzzyjoin) # 自定义5个目标分组的关键词映射 group_mapping <- tibble( keyword = c("immune", "eyes", "cardio", "respiratory", "neuro"), group = c("immune group", "eye group", "cardiovascular group", "respiratory group", "neurological group") )
- 批量匹配并分组
# 假设你的原始数据框为df,分类变量列名为category df_processed <- df %>% # 按正则匹配分类变量与关键词 regex_left_join(group_mapping, by = c("category" = "keyword")) %>% # 未匹配到关键词的归为"other group" mutate(group = coalesce(group, "other group")) %>% # 清理临时列 select(-keyword)
优化点:如果存在多关键词重叠(如某分类同时包含"immune"和"eyes"),调整group_mapping的行顺序即可设置匹配优先级(先出现的关键词优先匹配)。
方法2:data.table(超高效,适合大数据量)
利用data.table的快速索引和模糊匹配,处理1000+水平的速度更快:
library(data.table) # 转换为data.table格式 setDT(df) setDT(group_mapping) # 初始化分组为"other group" df[, group := "other group"] # 按顺序匹配关键词(优先级由行顺序决定) for (i in seq(nrow(group_mapping))) { df[category %like% group_mapping$keyword[i], group := group_mapping$group[i]] }
额外处理:大小写统一
若分类变量存在大小写不一致的情况,先统一转换为小写避免匹配遗漏:
df <- df %>% mutate(category_clean = tolower(category)) %>% regex_left_join(group_mapping %>% mutate(keyword = tolower(keyword)), by = c("category_clean" = "keyword")) %>% mutate(group = coalesce(group, "other group")) %>% select(-category_clean, -keyword)
内容的提问来源于stack exchange,提问作者statquest
相关产品推荐
相关产品推荐

