基于ID判断V1-V3列是否均含1,生成check变量的R语言求助
问题:按ID判断多列是否均含1并生成check变量
需求说明
要创建取值为1/0的变量check,规则为:针对每个ID,判断其对应的V1至V3列中是否每一列都至少存在一个值为1,满足则赋值1,否则赋值0。
原始数据框
DF <- data.frame (ID= c(1,1,1,2,3,3,4,5,5,6), V1= c(1,0,0,1,1,0,0,1,0,0), V2= c(1,1,0,0,1,0,1,1,0,0), V3= c(0,1,0,1,0,0,0,0,1,0))
错误代码及问题
使用以下dplyr代码时,group_by未按预期生效,仅按行判断是否存在非0值,未实现按ID整体判断各列是否均含1的逻辑:
DF %>% dplyr::group_by(ID) %>% dplyr::mutate(Check= case_when(if_any('V1':'V3',~.x!=0)~1,TRUE ~0)) %>% dplyr::ungroup()
期望输出
| ID | V1 | V2 | V3 | check |
|---|---|---|---|---|
| 1 | 1 | 1 | 0 | 1 |
| 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 |
| 2 | 1 | 0 | 1 | 0 |
| 3 | 1 | 1 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 4 | 0 | 1 | 0 | 0 |
| 5 | 1 | 1 | 0 | 1 |
| 5 | 0 | 0 | 1 | 1 |
| 6 | 0 | 0 | 0 | 0 |
修正后的代码及解释
通过if_all结合any实现分组内的列级判断,再将布尔结果转为1/0数值:
DF %>% dplyr::group_by(ID) %>% dplyr::mutate( check = as.integer( if_all(V1:V3, ~ any(.x == 1)) ) ) %>% dplyr::ungroup()
if_all(V1:V3, ~ any(.x ==1)):对每个ID分组,检查V1到V3的每一列是否都至少存在一个1,返回布尔值as.integer():将布尔值转换为1(TRUE)或0(FALSE),生成符合要求的check变量
执行后同一ID的所有行将获得相同的check值,完全匹配需求逻辑。
内容的提问来源于stack exchange,提问作者PsychSilvia
相关产品推荐
相关产品推荐

