基于部分字符串匹配为DataFrame新增分组列的R语言实现问题
解决R语言DataFrame分组判断问题
你的问题出在顺序执行的ifelse逻辑:当name包含"ano"时,第一个ifelse直接返回"one",不会继续检查是否同时包含"tuk"或"wai",因此无法识别"both"场景。
要正确实现需求,核心是先统计每行中属于{"ano", "tuk", "wai"}的代码数量,再根据数量赋值分组:
基础R实现方案
# 原始数据 data <- data.frame(name=c("ano ngo", "ano tuk", "ngo bon", "bon wai")) # 定义目标代码集合 target_codes <- c("ano", "tuk", "wai") # 计算每行符合条件的代码数量,并赋值group data$group <- sapply(strsplit(as.character(data$name), " "), function(x) { match_count <- sum(x %in% target_codes) if (match_count == 2) { "both" } else if (match_count == 1) { "one" } else { "neither" } })
执行后结果:
name group 1 ano ngo one 2 ano tuk both 3 ngo bon neither 4 bon wai one
代码逻辑说明
strsplit(as.character(data$name), " "):将每个name按空格拆分为两个代码的向量sapply(..., function(x) sum(x %in% target_codes)):遍历每个拆分后的向量,统计属于目标代码的数量- 根据统计的数量,判断返回对应的分组值:
- 数量=2 → "both"
- 数量=1 → "one"
- 数量=0 → "neither"
Tidyverse风格实现(可选)
如果你习惯使用dplyr/tidyr,也可以用以下方式:
library(dplyr) library(tidyr) data <- data %>% separate(name, into = c("code1", "code2"), sep = " ") %>% mutate( match_count = (code1 %in% target_codes) + (code2 %in% target_codes), group = case_when( match_count == 2 ~ "both", match_count == 1 ~ "one", TRUE ~ "neither" ) ) %>% unite(name, code1, code2, sep = " ") # 合并回原name列
内容的提问来源于stack exchange,提问作者Nichola
相关产品推荐
相关产品推荐

