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

时间:2019-08-02 10:54:54

标签: r dplyr

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

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

经过大量的在线搜索,我最近的人是:

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

library(dplyr)
mtcars$carnames <- rownames(mtcars)  # dummy data to test on

这行代码可以使整个字符串完全匹配:

mtcars %>% replace(., (.)=='Mazda RX4', "A car")

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

mtcars %>% replace(., grepl('Mazda', (.)), "A car")

1 个答案:

答案 0 :(得分:2)

library(dplyr)
mtcars %>% mutate_if(grepl('Mazda',.), ~replace(., grepl('Mazda', .), "A car"))

要了解为什么您首先replace失败的原因,请参见'Mazda RX4'==mtcarsgrepl('Mazda', mtcars)的区别,因为您使用了greplreplace使用了

  

replace用值中给定的索引替换list中给定的索引中的x中的值。 如有必要,值中的值将被回收。

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

mtcars %>% replace(., sapply(mtcars, function(.) grepl('Mazda',.)), "A car")

更新:

要替换多个模式,我们可以使用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")))