【问题标题】:Replacing parts of a list替换列表的一部分
【发布时间】:2012-12-03 14:58:17
【问题描述】:

有没有一种简单的方法可以用另一个字符串列表替换字符向量中的字符串子列表?像

gsub(c("a","b"),c("z","y"),a)

replace(a,c("a","b"),c("z","y"))

不幸的是,两者都不起作用?

【问题讨论】:

    标签: string r


    【解决方案1】:

    如果您只是替换单个字符,那么chartr 可能正是您要查找的内容:

    > chartr( "ab", "zy", "abababa")
    [1] "zyzyzyz"
    

    这个question 可能也很有趣。

    【讨论】:

    • 感谢@romainfrancois,一个很好的答案和一个我以前没有使用过的功能。我选择了另一个答案,因为这是我要采用的解决方案。
    【解决方案2】:

    使用gsub 的简单循环就足够了,并且在大多数情况下可能会执行得很好:

    a <- c("x","y")
    b <- c("a","b")
    vec <- "xy12"
    
     mgsub <- function(pattern,replacement,x,...){
        for (i in seq_along(pattern)){
            x <- gsub(pattern = pattern[i],replacement = replacement[i],x,...)
        }
        x
     }
    
    > mgsub(a,b,vec)
    [1] "ab12"
    

    【讨论】:

      【解决方案3】:

      我可以发誓在 R 中有一个递归应用,确实​​存在,但它做了一些非常不同的事情。

      总之,这是一个:

      #' Iteratively (recursively) apply a function to its own output
      #' @param X a vector of first arguments to be passed in
      #' @param FUN a function taking a changing (x) and an initial argument (init)
      #' @param init an argument to be "worked on" by FUN with parameters x[1], x[2], etc.
      #' @return the final value, of the same type as init
      #' @example
      #' vec <- "xy12"
      #' replacementPairs <- list( c("x","a"), c("y","b") )
      #' iapply( replacementPairs , FUN=function(repvec,x) {
      #'   gsub(repvec[1],repvec[2],x)
      #' }, init=vec )
      iapply <- function(X, FUN, init, ...) {
        res <- init
        for(x in X) {
          res <- FUN(x, res, ...)
        }
        res
      }
      

      示例返回"ab12"

      【讨论】:

        猜你喜欢
        • 2015-03-03
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 2021-05-19
        • 2017-06-23
        • 2013-11-03
        相关资源
        最近更新 更多