R语言:基于分组内多值条件替换数据框列中的字符串
使用dplyr实现分组条件替换review列值
直接用group_by + mutate就能搞定,不用filter(filter是用来筛选行的,你要的是修改列值),以下是两种实现方式:
方案1:生成新列(不修改原review)
library(dplyr) df <- df %>% # 按客户ID和订单日期分组 group_by(customerid, orderdate) %>% # 判断组内是否存在positive/negative,存在则设为done,否则保留原review mutate(review_updated = ifelse(any(status %in% c("positive", "negative")), "done", review)) %>% # 取消分组,避免后续操作受影响 ungroup()
方案2:直接覆盖原review列
如果不需要保留原review值,可以直接替换:
df <- df %>% group_by(customerid, orderdate) %>% mutate(review = ifelse(any(status %in% c("positive", "negative")), "done", review)) %>% ungroup()
关键逻辑说明
any(status %in% c("positive", "negative")):检查当前分组里是否有任意一条记录的status是目标值,只要有一个符合就返回TRUEmutate负责创建/修改列,这里用ifelse做条件判断,根据分组的检查结果替换值- 最后一定要加
ungroup(),不然数据框会一直保持分组状态,可能影响后续其他操作
示例验证
拿下面的测试数据跑一遍代码,就能看到效果:
# 测试数据 df <- tibble( customerid = c(1,1,1,2,2), orderdate = c("2024-01-01", "2024-01-01", "2024-01-02", "2024-01-01", "2024-01-02"), status = c("positive", "neutral", "neutral", "negative", "neutral"), review = c("pending", "pending", "pending", "pending", "pending") )
运行后,customerid=1且orderdate=2024-01-01的两条记录,review都会变成done;customerid=2且orderdate=2024-01-01的记录同理,其他组保持原pending值。
内容的提问来源于stack exchange,提问作者pandas123
相关产品推荐
相关产品推荐

