r - 如果 R 中的其他列中存在值,则用于创建 T/F 列的 dplyr 解决方案

我正在尝试创建一个二进制文件 T/F列,即 T如果 1 出现在数据帧的特定行中。

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   

但我确信一定有更优雅的解决方案来解决这个问题。

首先,我希望能够创建一个包含需要检查的列名的变量,即 dfCols <- c("d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8")并在检查时调用它,而不是显式调用 'd1'、'd2' 等中的每一个。

我也觉得一定有一个 tidyverse/dplyr 解决方案,但一直在努力寻找一个。

更新

基于此处提供的出色答案以及针对类似问题的类似 SO 条目 found here ,我能够开发出我需要的解决方案。

首先,虽然我的可重现示例包含整数,但我也想使用字符数据,按照这个小标题:

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')

以下代码满足这些条件:

df <- df %>% 
  mutate(
    d9 = case_when(
      if_any(all_of(cols), ~ . %in% bcde) ~ 1,
      TRUE ~ 0)
  )

相关文章:

javascript - 在javascript中找到嵌套数组中的最低值

c# - 从 C# 中的 Win32_PnPEntity 获取 DEVPKEY_Device_Bus

node.js - Docker + WebGL + Headless Chrome 错误 : Pa

visual-studio - 缺少 Visual Studio 性能探查器

python - 如何根据最大值将字典中的所有值分配给变量

javascript - 正则表达式获取第一次和最后一次出现之间的子字符串

python - 如何确定 Pandas DataFrame 中给定 x 和 y 坐标列的象限

c++ - 在 C++ 中的 unordered_map 中排序

php - Shopware 6 价格收集器/处理器的折扣计算错误

php - 无法加载 Mac M1 SQL Server SQLSrv OpenSSL 库,请确保已