dplyr 条件变异与 ifelse

dplyr conditional mutate with ifelse

我想让这个声明更通用

mutate(across(
  Kingdom:Genus,
  ~ ifelse(.x == "Incertae sedis", "*Incertae sedis*", .x)
))

如何以更通用的方式表示“* Incertae sedis *”?基本上我想在 .x

中的字符串的开头和结尾添加一个星号

您可以使用 paste0:

mutate(across(
  Kingdom:Genus,
  ~ ifelse(.x == "Incertae sedis", paste0("*", .x, "*"), .x)
))

如果您有多个要突出显示的术语,您可以先在向量中定义它们,然后改用它:


uncertain <- c("Incertae sedis", "Problematica", "Nomem Dubium")

df %>% mutate(across(
  Kingdom:Genus,
  ~ ifelse(.x %in% uncertain, paste0("*", .x, "*"), .x)
))

请注意这是实验性的: @Allan Cameron 的回答最好用 paste0

但我想分享这个:str_pad

# fake dataframe
df <- tribble(
  ~A, ~B, ~C,
  "Incertae sedis", "blabla", "Incertae sedis",
  "Incertae sedis",  "blabla", "bloblo",
  "Incertae", "Incertae sedis", "blibli"
)

library(dplyr)
library(stringr)

df %>% 
  mutate(across(A:C, ~ifelse(. == "Incertae sedis", str_pad(., nchar(.)+2, "both", pad="*"), .)))
 A                B                C               
  <chr>            <chr>            <chr>           
1 *Incertae sedis* blabla           *Incertae sedis*
2 *Incertae sedis* blabla           bloblo          
3 Incertae         *Incertae sedis* blibli    

一个选项是使用正则表达式

插入*
library(dplyr)
library(stringr)
df %>% 
   mutate(across(Kingdom:Genus,  ~str_replace(.x, "(Incertae sedis)", "*\1*")))