gpt4 book ai didi

r - str_replace_all 迭代地替换命名向量元素,而不是一次全部替换

转载 作者:行者123 更新时间:2023-12-04 11:29:49 24 4
gpt4 key购买 nike

假设我有一个长字符串:pneumonoultramicroscopicsilicovolcanoconiosis。我想使用 stringr::str_replace_all用其他字母替换某些字母。根据文档,str_replace_all可以采用命名向量并将名称替换为值。这对于 1 次替换效果很好,但对于多次替换来说,它似乎是迭代的,所以结果是替换了前一次迭代。我不确定这是预期的行为。

library(tidyverse)
text_string = "developer"
text_string %>%
str_replace_all(c(e ="X")) #this works fine
[1] "dXvXlopXr"
text_string %>%
str_replace_all(c(e ="p", p = "e")) #not intended behaviour
[1] "develoeer"

期望的结果:
[1] "dpvploepr"

我通过引入一个新角色得到:
text_string %>% 
str_replace_all(c(e ="X", p = "e", X = "p"))

这是一个可用的解决方法,但很难推广。这是一个错误还是我的期望是错误的?

我也想替换 n 带有 的字母n 同时使用其他字母,最好使用两个向量(如“旧”和"new")或命名向量作为输入。

reprex 编辑以便于人类阅读

最佳答案

迭代行为是有意的。也就是说,我们可以使用编写自己的解决方法。我将使用 character subsetting更换。

在命名向量中,我们可以按名称查找事物并为每个名称获取替换值。这就像同时进行所有替换。

rules <- c(a = "X", b = "Y", X = "a")
chars <- c("a", "a", "b", "X", "X")
rules[chars]
#> a a b X X
#> "X" "X" "Y" "a" "a"

所以在这里,查找 "a"rules矢量得到我们 "X" , 有效替换 "a""X" .其他角色也是如此。

一个问题是没有匹配的名称会产生 NA .

rules <- c(a = "X", b = "Y", X = "a")
chars <- c("a", "Y", "Z")
rules[chars]
#> a <NA> <NA>
#> "X" NA NA

为了防止出现 NA,我们可以扩展规则以包含任何新字符,以便将字符替换为自身。

rules <- c(a = "X", b = "Y", X = "a")
chars <- c("a", "Y", "Z")
no_rule <- chars[! chars %in% names(rules)]
rules2 <- c(rules, setNames(no_rule, no_rule))
rules2[chars]
#> a Y Z
#> "X" "Y" "Z"

这就是以下函数背后的逻辑。
  • 将字符串分解为字符
  • 创建替换规则的完整列表
  • 查找替换值
  • 把绳子粘在一起


  • library(stringr)

    str_replace_chars <- function(string, rules) {
    # Expand rules to replace characters with themselves
    # if those characters do not have a replacement rule
    chars <- unique(unlist(strsplit(string, "")))
    complete_rules <- setNames(chars, chars)
    complete_rules[names(rules)] <- rules

    # Split each string into characters, replace and unsplit
    for (string_i in seq_along(string)) {
    chars_i <- unlist(strsplit(string[string_i], ""))
    string[string_i] <- paste0(complete_rules[chars_i], collapse = "")
    }
    string
    }

    rules <- c(a = "X", p = "e", e = "p")
    string <- c("application", "developer")
    str_replace_chars(string, rules)
    #> [1] "XeelicXtion" "dpvploepr"

    关于r - str_replace_all 迭代地替换命名向量元素,而不是一次全部替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48169135/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com