将数据框中除 xyz 之外的所有字符列小写

Lowercase all character columns except xyz in dataframe

foo() 将数据框的所有字符列小写 except=,其名称由用户提供。

我想知道为什么当我提供 except="study" 时,foo 错误地将 data 中的列 study 小写了?

可重现的代码和所需的输出如下。

m="
study cap  back
AA    L    1
BB    F    2
CC    H    8"
data <- read.table(text=m,h=T)


foo <- function(X, except = NULL){
  y <- sapply(setdiff(names(X), except), function(x) is.character(as.vector(X[[x]])))
  X[y] <- lapply(X[y], tolower)
return(X)
}
#=== EXAMPLE OF USE:
foo(data, except = c("study"))

Desired_output=
"
study cap  back
AA    l    1
BB    f    2
CC    h    8"

这里有两种实现方式-

基础 R -

foo <- function(X, except = NULL){
  y <- names(Filter(is.character, X[setdiff(names(X), except)]))
  X[y] <- lapply(X[y], tolower)
  return(X)
}
foo(data, except = c("study"))

#  study cap back
#1    AA   l    1
#2    BB   f    2
#3    CC   h    8

使用dplyr-

library(dplyr)

foo <- function(X, except = NULL){
  X %>%
    mutate(across(where(is.character) & 
                  all_of(setdiff(names(X), except)), tolower))
}

foo(data, except = c("study"))