R语言如何使用ifelse实现分组内跨多行统一重编码
R按分组统一填充新列实现方案
需求回顾
按episode_id对数据框分组,只要同组内任意一行的issue列包含"bro"字符串,该组所有行的新列broke统一取值为1,否则取0。
测试数据构造
episode_id <- c(2,2,56,56,67,67,67) issue <- c("loose","faulty","broke","faulty","loose","broke","missing") df <- data.frame(episode_id,issue)
原先的逐行判断代码仅能给匹配到的单行打标,无法满足组内统一赋值的要求:
# 仅逐行生效,不符合分组规则 df$broke <- ifelse(grepl("bro",df$issue),1,0)
实现方法
方法1:dplyr 分组实现(推荐)
之前调用group_by未得到预期结果,是因为缺少组内聚合判断的步骤,搭配mutate+组内any()判断即可实现需求:
library(dplyr) df <- df %>% group_by(episode_id) %>% mutate(broke = as.integer(any(grepl("bro", issue)))) %>% ungroup()
逻辑说明:
- 按
episode_id划分计算分组 any(grepl("bro", issue))逐组判断是否存在匹配"bro"的记录,返回组级别的逻辑结果as.integer()将逻辑值TRUE/FALSE转换为1/0,和原有字段格式保持一致- 最后用
ungroup()解除数据框的分组状态,避免后续其他计算受分组规则干扰
方法2:基础R实现(无第三方包依赖)
不想加载dplyr的话,可以直接用基础R的ave函数完成分组计算:
df$broke <- as.integer(ave(grepl("bro", df$issue), df$episode_id, FUN = any))
结果校验
运行代码后最终输出的数据框如下,完全符合分组统一打标的要求:
| episode_id | issue | broke |
|---|---|---|
| 2 | loose | 0 |
| 2 | faulty | 0 |
| 56 | broke | 1 |
| 56 | faulty | 1 |
| 67 | loose | 1 |
| 67 | broke | 1 |
| 67 | missing | 1 |
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

