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

Posted

技术标签:

【中文标题】小写数据框中除 xyz 之外的所有字符列【英文标题】:Lowercase all character columns except xyz in dataframe 【发布时间】:2022-01-15 14:46:50 【问题描述】:

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

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

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

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"

【问题讨论】:

【参考方案1】:

这里有两种方法可以实现这一点-

基础 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"))

【讨论】:

感谢@Ronak Shah 的回答。为什么这对data &lt;- data.frame(Study = c("AA", "BB", "CC"), Cap = c("L", "F", "H"), Back = c(1, 2, 8)); except &lt;- "Study" 不起作用? 如果您使用我的示例 dataexcept 以及您的 foo(),则不会将列转换为小写。你介意自己试试吗? 没关系。对于那个很抱歉。我在想列名而不是值。 您可以简化为across(where(is.character) &amp; !except, tolower) 感兴趣的问题HERE。

以上是关于小写数据框中除 xyz 之外的所有字符列的主要内容,如果未能解决你的问题,请参考以下文章

删除 VIM 中除第一列之外的所有内容

如何与正则表达式匹配PHP中除“-”之外的所有特殊字符?

有没有办法删除Python中字符串中除字母之外的所有字符?

PHP 删除字符串中除数字之外的所有内容

如何从包含特定列中特定字符串的熊猫数据框中删除行? [复制]

如何将逗号添加到字符串中除最后一项之外的所有内容