根据与 dplyr 的部分匹配替换数据帧中任意位置的整个字符串

Mar*_*ark 4 r dplyr

我正在努力寻找要使用的正确 dplyr 代码grepl或等效的代码来替换整个数据帧中的值。

即:任何包含“马自达”的单元格都应该将其全部内容替换为新字符串“A car”

在网上搜索了很多之后,我最接近的是:

重点是将其应用于所有列。

library(dplyr)
mtcars$carnames <- rownames(mtcars)  # dummy data to test on
Run Code Online (Sandbox Code Playgroud)

这一行可以使整个 sting 完全匹配:

mtcars %>% replace(., (.)=='Mazda RX4', "A car")
Run Code Online (Sandbox Code Playgroud)

但是由于某种原因,我的 grepl 尝试将整个列替换为“A car”。

mtcars %>% replace(., grepl('Mazda', (.)), "A car")
Run Code Online (Sandbox Code Playgroud)

A. *_*man 7

library(dplyr)
mtcars %>% mutate_if(grepl('Mazda',.), ~replace(., grepl('Mazda', .), "A car"))
Run Code Online (Sandbox Code Playgroud)

要理解为什么你第一次replace未能看到的区别'Mazda RX4'==mtcarsgrepl('Mazda', mtcars),因为你使用greplreplace用途

replace 用列表中给出的索引替换 x 中的值。如有必要,会回收 values 中的值。

现在我们可以使用您的第一种方法,如果我们确保使用sapply例如获得合适的输出

mtcars %>% replace(., sapply(mtcars, function(.) grepl('Mazda',.)), "A car")
Run Code Online (Sandbox Code Playgroud)

更新:

替换我们可以使用的多个模式 stringr::str_replace_all

library(stringr)
library(dplyr)
mtcars %>% mutate_if(str_detect(., 'Mazda|Merc'), 
                    ~str_replace_all(., c("Mazda.*" = "A car", "Merc.*" = "B car")))
Run Code Online (Sandbox Code Playgroud)

  • `str_replace_all` 比 `case_when` 好得多,因为它不会将数字列更改为与 `mutate_all` 和 `mutate_if` 相同的字符列 (2认同)