【问题标题】:Replace entire string anywhere in dataframe based on partial match with dplyr根据与 dplyr 的部分匹配替换数据框中任何位置的整个字符串
【发布时间】:2019-12-10 23:58:41
【问题描述】:

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

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

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

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

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

这一行的诀窍使整个 sting 完全匹配:

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

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

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    library(dplyr)
    mtcars %>% mutate_if(grepl('Mazda',.), ~replace(., grepl('Mazda', .), "A car"))
    

    要了解为什么你首先replace 失败,请查看'Mazda RX4'==mtcarsgrepl('Mazda', mtcars) 之间的区别,因为你使用greplreplace 使用

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

    如果我们确保使用 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")))
    

    【讨论】:

    • 啊,缺少 mutate_all 包装器。你知道是否还有一种方法可以在同一个 mutate_all 中用另一个替换(即grepl('Merc', .), "B car"))替换第二个字符串,还是我必须为此添加另一个包装器?
    • 对不起,我的第一个答案不完整,请查看我的更新。对于你的第二个问题,我们可以做mtcars %&gt;% mutate_all(~case_when(grepl('Mazda', .)~'A car', grepl('Merc', .)~'B car', TRUE ~ as.character(.))),但一分钟让我看看我们是否可以做多个replace
    • str_replace_allcase_when 好得多,因为它不会将数字列更改为与mutate_allmutate_if 相同的字符列
    • 具有额外多种组合的“更新”是这个答案的真正赢家。
    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 2020-09-27
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多