如何将所有值重新编码为小写但忽略 TRUE 和 FALSE? 数据 重新编码数据 但我正在努力实现这一目标

问题描述

我有数据要转换为小写并使用 snakecase::to_any_case() 用下划线分隔。但是,我希望忽略包含 TRUE/FALSE 的单元格并将它们保留为大写。

数据

用于制作可重现的示例

library(dplyr)

df <-
  tibble(animals = c("Peregrine falcon","Golden eagle",TRUE,"White-throated needletail swift"),cars = c("Hennessey Venom GT",FALSE,"Bugatti Chiron Super Sport 300+","Hennessey Venom F5"),airplanes = c("north American X-15","Lockheed SR-71 Blackbird","Lockheed YF-12")) %>%
  mutate_all(as.character)

##   animals                         cars                            airplanes               
##   <chr>                           <chr>                           <chr>                   
## 1 Peregrine falcon                Hennessey Venom GT              north American X-15     
## 2 Golden eagle                    FALSE                           Lockheed SR-71 Blackbird
## 3 TRUE                            Bugatti Chiron Super Sport 300+ FALSE                   
## 4 White-throated needletail swift Hennessey Venom F5              Lockheed YF-12 

重新编码数据

library(snakecase)

df %>% 
  mutate(across(everything(),to_any_case))      # dplyr 1.0.2

##   animals                         cars                           airplanes               
##   <chr>                           <chr>                          <chr>                   
## 1 peregrine_falcon                hennessey_venom_gt             north_american_x_15     
## 2 golden_eagle                    false                          lockheed_sr_71_blackbird
## 3 true                            bugatti_chiron_super_sport_300 false                   
## 4 white_throated_needletail_swift hennessey_venom_f_5            lockheed_yf_12 

但我正在努力实现这一目标

  animals                         cars                           airplanes               
  <chr>                           <chr>                          <chr>                   
1 peregrine_falcon                hennessey_venom_gt             north_american_x_15     
2 golden_eagle                    FALSE                          lockheed_sr_71_blackbird
3 TRUE                            bugatti_chiron_super_sport_300 FALSE                   
4 white_throated_needletail_swift hennessey_venom_f_5            lockheed_yf_12   

如何在忽略 mutate(across(everything(),to_any_case))TRUE 值的情况下运行 FALSE

解决方法

我不是 dplyr 语法方面的专家,但以下应该有效:

library(snakecase)

to_any_no_tf <- function(x) {
    ifelse(!grepl("^(?:TRUE|FALSE)$",x),to_any_case(x),x)
}

df %>% mutate(across(everything(),to_any_no_tf))

这里的逻辑是使用grepl来检查输入值是字符串TRUE还是FALSE。如果是这样,那么我们不会对它们应用任何大小写逻辑,否则我们会像您一样调用 to_any_case()