R语言使用dplyr根据其他列是否存在指定值创建布尔列的方法
R数据框行存在性判断列实现方案
需求为在R数据框中新增一列,当前行在指定列范围内存在目标值时为TRUE/1,否则为FALSE/NA,无需逐列硬编码列名,采用tidyverse/dplyr体系实现。
原始数值型场景
示例数据
df <- tibble( d1 = c(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), d2 = c(0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0), d3 = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), d4 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), d5 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), d6 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), d7 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), d8 = c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0) )
原有冗余实现
逐列赋值的方式可实现需求,但列数较多时代码可维护性极差:
df$d9 <- NA df$d9[df$d1 == 1] <- TRUE df$d9[df$d2 == 1] <- TRUE df$d9[df$d3 == 1] <- TRUE df$d9[df$d4 == 1] <- TRUE df$d9[df$d5 == 1] <- TRUE df$d9[df$d6 == 1] <- TRUE df$d9[df$d7 == 1] <- TRUE df$d9[df$d8 == 1] <- TRUE
输出结果
d1 d2 d3 d4 d5 d6 d7 d8 d9 <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> 1 1 0 0 0 0 0 0 0 TRUE 2 0 0 0 0 0 0 0 0 NA 3 0 0 1 0 0 0 0 0 TRUE 4 0 0 0 0 0 0 0 0 NA 5 0 0 0 0 0 0 0 0 NA 6 0 0 0 0 0 0 0 0 NA 7 0 0 0 0 0 0 0 1 TRUE 8 0 1 0 0 0 0 0 0 TRUE 9 0 0 0 0 0 0 0 0 NA 10 0 0 0 0 0 0 0 0 NA 11 0 0 0 1 0 0 1 0 TRUE 12 0 0 0 0 0 0 0 0 NA 13 0 0 0 0 0 0 0 0 NA 14 0 0 0 0 0 0 0 0 NA 15 0 0 0 0 0 0 0 0 NA
通用实现方案
支持数值、字符等各类数据类型,可灵活指定待检查列、待匹配目标值列表,输出支持布尔值或二进制0/1值。
字符型示例数据
df <- tibble( d1 = c('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'), d2 = c('b', 'a', 'b', 'a', 'a', 'a', 'a', 'a'), d3 = c('a', 'a', 'a', 'c', 'a', 'b', 'a', 'a'), d4 = c('a', 'a', 'a', 'a', 'a', 'a', 'a', 'd'), d5 = c('a', 'c', 'a', 'a', 'a', 'a', 'a', 'a'), d6 = c('a', 'a', 'a', 'b', 'a', 'a', 'e', 'a'), d7 = c('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'), d8 = c('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a') )
自定义参数
- 待检查的列名列表:
cols <- c('d2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8')
- 待匹配的目标值列表:
bcde <- c('b', 'c', 'd', 'e')
如果是数值场景判断是否存在1,仅需要将目标值列表改为target <- c(1)即可。
核心实现代码
借助dplyr的if_any函数实现行级存在性判断,代码简洁易维护:
df <- df %>% mutate( # 若需要输出TRUE/NA,可替换为d9 = ifelse(if_any(all_of(cols), ~ . %in% bcde), TRUE, NA) d9 = case_when( if_any(all_of(cols), ~ . %in% bcde) ~ 1, TRUE ~ 0) )
内容的提问来源于stack exchange,提问作者sdg
相关产品推荐
相关产品推荐

