如何用dplyr创建基于ID列和Condition列的Flag布尔列?
解决dplyr分组标记Flag的问题
你的代码有两个核心问题:
- 判断条件写错了,应该是
Condition == "A"而非Condition == 1 - 没有针对整个ID分组做判断,只是逐行检查当前行的Condition值,导致只有A所在行的Flag为1,同ID其他行无法同步标记
正确代码实现
用any()函数在分组内检查是否存在至少一个"A",再将布尔结果转换为1/0即可:
library(dplyr) data %>% group_by(ID) %>% mutate(Flag = as.integer(any(Condition == "A"))) %>% ungroup() # 可选,取消分组避免后续操作受影响
或者用+号快速转换布尔值(R中TRUE等价于1,FALSE等价于0):
data %>% group_by(ID) %>% mutate(Flag = +(any(Condition == "A"))) %>% ungroup()
验证结果
用你提供的初始数据测试:
# 构造初始数据 data <- tibble( ID = c(1,1,1,2,2), Condition = c("B","B","A","B","B") ) # 运行代码后输出 data %>% group_by(ID) %>% mutate(Flag = as.integer(any(Condition == "A"))) %>% ungroup()
得到的结果完全符合目标表要求:
| ID | Condition | Flag |
|---|---|---|
| 1 | B | 1 |
| 1 | B | 1 |
| 1 | A | 1 |
| 2 | B | 0 |
| 2 | B | 0 |
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

