【问题标题】:R How to remap letters in a stringR如何重新映射字符串中的字母
【发布时间】:2021-08-31 13:32:03
【问题描述】:

我将不胜感激有关如何以映射指定的方式重新映射字符串中的字母的建议。

假设,例如,我想将所有 As 更改为 Bs,将所有 Bs 更改为 Ds,并将所有 Ds 更改为 Fs。如果我这样做,它不会做我想要的,因为它会连续应用转换:

"abc" %>% str_replace_all(c(a = "b", b = "d", d = "f"))

这是我可以做我想做的事的一种方式,但感觉有点笨拙。

f <- function (str) str_c( c(a = "b", b = "d", c = "c", d = "f") %>% .[ strsplit(str, "")[[1]] ], collapse = "" )

"abc" %>% map_chr(f)

我们将不胜感激更好的想法。

詹姆斯。

附:忘记指定了。有时我想用多个字母替换一个字母,例如,将所有 As 替换为字符串 ZZZ。

P.P.S.理想情况下,这也可以处理字符串向量,例如 c("abc", "gersgaesg", etc.)

【问题讨论】:

    标签: r list str-replace remap


    【解决方案1】:

    我们可以在base R 中使用chartr

    chartr("abc", "bdf", "abbbce")
    #[1] "bdddfe"
    

    或者一个包解决方案是mgsub,它也将匹配和替换字符数大于1的字符串

    library(mgsub)
    mgsub("abbbce",  c("a", "b", "c"), c("b", "d", "f"))
    #[1] "bdddfe"
    
    mgsub("abbbce",  c("a", "b", "c"), c("ba", "ZZZ", "f"))
    #[1] "baZZZZZZZZZfe"
    

    【讨论】:

    • 非常感谢。这会很棒,但我有时想用两个字母替换一个字母,例如,用字符串 ZZZ 替换 As。我的错。我应该事先指定的。
    • @JamesBejon 然后,它不会工作。我在想你只需要一个字母替换。有时,我们会按字面意思举例
    • @JamesBejon 我能问一下为什么str_replace_all 不适合你。这是一个非常紧凑的代码
    • 是的。这是一个没有明确说明的问题。道歉。无论如何,感谢您的努力。
    • 太棒了! mgsub 正是我所追求的!!非常感谢。
    【解决方案2】:

    也许这更优雅?当未找到值时,它也会返回警告。

    library(plyr)
    library(tidyverse)
    mappings <- c(a = "b", b = "d", d = "f")
    
    str_split("abc", pattern = "") %>% 
      unlist() %>% 
      mapvalues(from = names(mappings), to = mappings) %>%
      str_c(collapse = "")
    
    # The following `from` values were not present in `x`: d
    # [1] "bdc"
    

    【讨论】:

    • 这当然是对我的改进。谢谢。欣赏它。
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多