搜索具有严格 0/1 数据的变量,并将它们转换为 R 和 dplyr/tidyverse/pipe 中 Yes/No 的因子

ECI*_*CII 5 r dplyr

我有

  df <- data.frame(
  var1 = c(0, 1, 0, 1, 1, 0, 1),
  var2 = c("1", "1", "0", "0", "1", "1", "0"),
  var3 = c("1", "1", "0", "0", "1", "3", "1"),
  var4 = c(0, 0, 1, 1, 1, 0, 3),
  var5 = c("Yes", "No", "Yes", "No", "Yes", "No", "Yes"),
  var6 = c("Yes", "No", "Yes", "No", "Yes", "No", "Maybe")
)
Run Code Online (Sandbox Code Playgroud)

我想搜索严格 0/1值的所有变量,并将它们转换为带有"No"/"Yes"标签的因子。

我的尝试是

df %>%
  mutate(across(where(unique(.) == c("0", "1")), 
                .fns = ~factor(ifelse(., "Yes", "No"), levels = c("Yes", "No"))))
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用。

Error in `mutate()`:
! Problem while computing `..1 = across(...)`.
Caused by error in `across()`:
! Problem while evaluating `where(unique(.) == c("0", "1"))`.
Caused by error in `where()`:
! Can't convert `fn`, a logical matrix, to a function.
Run Code Online (Sandbox Code Playgroud)

tidyverse我在/系统内寻求解决方案dplyr pipe。我不想指定要搜索或转换哪个变量。

仅在上面的例子中var1var2应该被转换。

H 1*_*H 1 6

您应该能够执行以下操作:

library(dplyr)

df %>%
  mutate(across(where(~ all(.x %in% 0:1)), factor, labels = c("No", "Yes")))

  var1 var2 var3 var4 var5  var6
1   No  Yes    1    0  Yes   Yes
2  Yes  Yes    1    0   No    No
3   No   No    0    1  Yes   Yes
4  Yes   No    0    1   No    No
5  Yes  Yes    1    1  Yes   Yes
6   No  Yes    3    0   No    No
7  Yes   No    1    3  Yes Maybe
Run Code Online (Sandbox Code Playgroud)