我正在努力寻找正确的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")
答案 0 :(得分:2)
library(dplyr)
mtcars %>% mutate_if(grepl('Mazda',.), ~replace(., grepl('Mazda', .), "A car"))
要了解为什么您首先replace
失败的原因,请参见'Mazda RX4'==mtcars
和grepl('Mazda', mtcars)
的区别,因为您使用了grepl
,replace
使用了
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")))