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

基于部分字符串匹配为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

代码逻辑说明

  1. strsplit(as.character(data$name), " "):将每个name按空格拆分为两个代码的向量
  2. sapply(..., function(x) sum(x %in% target_codes)):遍历每个拆分后的向量,统计属于目标代码的数量
  3. 根据统计的数量,判断返回对应的分组值:
    • 数量=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:01:09