R中按分组匹配两个向量值新增ClassType列的实现问题
解决方案
错误原因
你原来的代码存在两个核心逻辑问题:
Sales == any(x)写法错误:any(x)会直接返回逻辑值TRUE(因为x是非空字符向量),相当于拿Sales列的字符串和逻辑值做匹配,完全不符合需求- 没有按分组维度判断整个组的Sales集合和x、y的匹配关系,而是逐行判断单个Sales值,和你要求的分组内整体判断规则不符
可行实现方案
1. Tidyverse(dplyr)方案
和你原来使用的语法习惯一致,代码如下:
library(dplyr) # 你预设的向量 x <- c("Bread","Milk") y <- c("Egg","Cheese","Rice") # 核心计算逻辑 df <- df %>% group_by(Group) %>% mutate( ClassType = case_when( # 分组内有x的元素且无y的元素,赋值Class1 any(Sales %in% x) & !any(Sales %in% y) ~ "Class1", # 分组内同时有x和y的元素,赋值Class2 any(Sales %in% x) & any(Sales %in% y) ~ "Class2", # 其他情况默认赋值为空,你可以根据需求补充规则 TRUE ~ NA_character_ ) ) %>% ungroup()
运行后得到的ClassType和你给出的示例结果完全一致。
2. data.table方案
如果你追求更高的运行效率,可以使用data.table实现:
library(data.table) setDT(df) df[, ClassType := fcase( any(Sales %in% x) & !any(Sales %in% y), "Class1", any(Sales %in% x) & any(Sales %in% y), "Class2" ), by = Group]
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

