我首先嘗試使用它:
for (i in names(data)){
data[paste0('FLAG_NA_',i)]<- ifelse(is.na(data$i),1,0)
}
但是此代碼僅創建僅具有 NA 值的新列
我在這里找到了與我想要的類似的解決方案:How to apply ifelse function across multiple columns and create new columns in R。
答案是:
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
uj5u.com熱心網友回復:
.namesinacross不應該是向量。它應該是單個字符值,用作名稱的“粘合規范”,使用“{.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 包于 2022-02-17 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426672.html
