You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:00:00