使用dplyr将编码为"Y"/"N"的所有变量转换为TRUE/FALSE

crf*_*crf 1 r dplyr

我有以下数据

df <- data.frame(A = 1:3, YN_B = c('Y', 'N', 'N'), YN_C = c('N', 'N', 'Y'))
Run Code Online (Sandbox Code Playgroud)

这些带有c('Y','N')值的变量对我来说并不是很有用.对于'Y',它们将更有用,编码为TRUE,对于'N',编码为FALSE.有用的是,Y/N列的命名方式可以让我以编程方式找到它们.我认为那mutate_if应该是一个帮助.

我试图用mutate_if实现这一点,我之前没有使用过,但它并不是很有效.这是我的尝试

df %>% mutate_if(matches('^YN'), .funs = funs(function(x) x == 'Y'))
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'p' of mode 'function' was not found
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

Psi*_*dom 7

matches返回指定列位置的整数,但是,mutate_if需要布尔值作为谓词.为了与matches您合作,您可以使用mutate_at:

library(dplyr)
df %>% mutate_at(vars(matches('^YN')), funs(. == 'Y'))
#   A  YN_B  YN_C
# 1 1  TRUE FALSE
# 2 2 FALSE FALSE
# 3 3 FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

这是一个如何matches工作的例子:

matches('^YN', vars = c("A", "YN_B"))
# [1] 2
Run Code Online (Sandbox Code Playgroud)

mutate_if这里添加另一个案例,我们可以根据列类型改变列:

lapply(df, class)
# $A
# [1] "numeric"

# $YN_B
# [1] "character"

# $YN_C
# [1] "character"

df %>% mutate_if(is.character, funs(. == 'Y'))
#   A  YN_B  YN_C
# 1 1  TRUE FALSE
# 2 2 FALSE FALSE
# 3 3 FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)