如何使用 ifelse 基于具有 NA 值的多个列创建多个标志列?

How do I create multiple flag columns based on multiple columns with NA Values using ifelse?

我先尝试使用这个:

for (i in names(data)){
  data[paste0('FLAG_NA_',i)]<- ifelse(is.na(data$i),1,0)
}

但是这段代码只创建了只有 NA 值的新列

我在这里找到了与我想要的类似的解决方案:

答案是:

data %>%
  mutate(across(starts_with('C'), ~ifelse( .x == "Off", 1, 0), .names = 'scr_{sub("C", "", .col)}'))

但是当我尝试在代码中使用 is.na() 条件时,它不起作用:

data %>%
  mutate(across(names(data), ~ifelse( .x %>% is.na, 1, 0), .names = paste0('FLAG_NA_',names(data))))

错误信息:

Error: Problem with `mutate()` input `..1`.
i `..1 = across(...)`.
x All unnamed arguments must be length 1

across中的.names不应该是向量。它应该是一个单一的字符值,作为名称的“胶水规范”,使用“{.col} 代表选定的列名,{.fn} 代表所应用的函数的名称”。所以在这种情况下,您可以使用 'FLAG_NA_{.col}',生成以下输出。

## Example data
set.seed(2022)
library(magrittr)
data <- 
  letters[1:3] %>% 
    setNames(., .) %>% 
    purrr::map_dfc(~ sample(c(1, NA, 3), 5, T))
  
data
#> # A tibble: 5 × 3
#>       a     b     c
#>   <dbl> <dbl> <dbl>
#> 1     3     3     3
#> 2    NA    NA     1
#> 3     3     3    NA
#> 4     3     1     3
#> 5    NA    NA    NA

## Create new variables
library(dplyr, warn.conflicts = FALSE)

data %>%
  mutate(across(everything(), ~ as.numeric(is.na(.x)), 
         .names = 'FLAG_NA_{.col}'))
#> # A tibble: 5 × 6
#>       a     b     c FLAG_NA_a FLAG_NA_b FLAG_NA_c
#>   <dbl> <dbl> <dbl>     <dbl>     <dbl>     <dbl>
#> 1     3     3     3         0         0         0
#> 2    NA    NA     1         1         1         0
#> 3     3     3    NA         0         0         1
#> 4     3     1     3         0         0         0
#> 5    NA    NA    NA         1         1         1

reprex package (v2.0.1)

创建于 2022-02-17