首页 > 解决方案 > 在 R 中:在列中搜索不同的字符串模式并替换所有这些模式

问题描述

我有一个包含不同游戏标题的专栏。为了收集它们,我必须将它们全部更改为单数拼写。例如,我有:

str_replace_all(FavouriteGames_DF$FavGame1, pattern = c("SKYRIM|
                                          THE ELDER SCROLLS V: SKYRIM|
                                          ELDER SCROLLS SKYRIM|
                                          ELDER SCROLLS V SKYRIM|
                                          SKYRIM (BETHESDA 2011)|
                                          SKYRIM (MODDED)|
                                          THE ELDERSCROLLS V: SKYRIM"), 
            replacement = "THE ELDER SCROLLS 5: SKYRIM")

问题是, str_replace_all 对此有点不好,因为它不能只搜索任何匹配的模式并将其替换为替换,但显然必须按顺序遍历它,我无法预测 DataSet 中的哪个任期即将到来。我不希望该函数替换不完整的匹配项(即,将“The ELDERSCROLLS V: SKYRIM”转换为 THE ELDERSCOLLS V: THE ELDER SCROLL 5: Skyrim”)将模式放入pattern = c("1", "2")其中根本不起作用,因为它只能按顺序检查模式。

我还尝试了 DataCombine 包中的 FindReplace 函数,但由于我不太理解的原因(声称我缺少维度并且向量不是字符向量),该函数似乎也不起作用。无论如何,我想使用尽可能少的包,并且更愿意留在 tidyverse 中。

有人有好的解决方案吗?我不想单独搜索每个术语,因为我必须经常这样做,而且我已经必须为 6 列执行此操作,因为 mutate_at doesn_t 似乎可以与 str_replace 一起使用。

谢谢!

标签: rtidyversestringr

解决方案


一个方便的解决方案是只使用“SKYRIM”作为模式,因为它是您指定的所有模式的通用词。您可以定义一个非常简单的函数来检查该模式,然后lapply在您要检查的特定列上使用:

check <- function(x){
    y <- unlist(strsplit(x, " "))
    if("SKYRIM" %in% y)
        return("THE ELDER SCROLLS 5: SKYRIM")
    else
        return(x)
}

FavouriteGames_DF["FavGame1"] <- lapply(FavouriteGames_DF["FavGame1"], check)

推荐阅读