我正在努力寻找要使用的正确 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)
library(dplyr)
mtcars %>% mutate_if(grepl('Mazda',.), ~replace(., grepl('Mazda', .), "A car"))
Run Code Online (Sandbox Code Playgroud)
要理解为什么你第一次replace未能看到的区别'Mazda RX4'==mtcars和grepl('Mazda', mtcars),因为你使用grepl,replace用途
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)