问题描述
我有数据要转换为小写并使用 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()
。