代码之家  ›  专栏  ›  技术社区  ›  Neeraj

用R中的另一组单词替换该组单词

  •  4
  • Neeraj  · 技术社区  · 1 年前

    这是一个简单的问题。我有一份国名清单。然而,我想用正确的名字改几个名字。所以,我还有两个向量;一个有要更改的名称,第二个有正确的名称。请参阅示例:

    #country names (names are repetitive in the list)
    cn <- c("I", "A", "B", "C", "A", "C", "D", "P")
    
    change <- c("A", "B")
    tochange <- c("X", "Y")
    

    预期产量

    cn <- c("I", "X", "Y", "C", "X", "C", "D", "P")
    

    谢谢

    5 回复  |  直到 1 年前
        1
  •  4
  •   jay.sf    1 年前

    Uisng stringi::stri_replace_all_fixed .

    > stringi::stri_replace_all_fixed(cn, change, tochange, vectorize_all=FALSE)
    [1] "I" "X" "Y" "C" "X" "C" "D" "P"
    
        2
  •  4
  •   ThomasIsCoding    1 年前

    你可以试试 replace + match 如下图所示

    > d <- tochange[match(cn, change)]
    
    > replace(cn, !is.na(d), na.omit(d))
    [1] "I" "X" "Y" "C" "X" "C" "D" "P"
    
        3
  •  2
  •   AkselA    1 年前

    作为基本 for 循环:

    cn.new <- cn
    
    for (i in seq_along(change)) {
        cn.new[cn.new == change[i]] <- tochange[i]
    }
    
    cn
    # [1] "I" "A" "B" "C" "A" "C" "D" "P"
    cn.new
    # [1] "I" "X" "Y" "C" "X" "C" "D" "P"
    
        4
  •  2
  •   G. Grothendieck    1 年前

    以下是一些替代方案

    1) gsubfn gsubfn 是对 gsub 其中第二个参数不仅可以是字符串,还可以是我们在这里使用的命名列表(或函数或原型对象)。

    library(gsubfn)
    gsubfn("^.*$", setNames(as.list(change), tochange), cn)
    ## [1] "I" "A" "B" "C" "A" "C" "D" "P"
    

    2) 减少 基础R解决方案是使用 Reduce

    dict <- setNames(change, tochange)
    Reduce(\(x, y) replace(x, names(y), y), init = cn, dict)
    ## [1] "I" "A" "B" "C" "A" "C" "D" "P"
    

    3) 图表 如果字符串中的名称是单个字符,如问题中所示,则以R为基 chartr 可以使用

    chartr(paste0(tochange, collapse = ""), paste0(change, collapse = ""), cn)
    ## [1] "I" "A" "B" "C" "A" "C" "D" "P"
    

    或对名称进行硬编码

    chartr("XY", "AB", cn)
    ## [1] "I" "A" "B" "C" "A" "C" "D" "P"
    

    循环性

    虽然这里的问题似乎不太可能表现出循环性,例如A->B->A如果你认为有可能,我们可以测试一下。

    library(igraph)
    
    cnt <- cbind(change, tochange) |>
      graph_from_edgelist() |>
      count_components()
    
    if (cnt != length(change)) stop("circularity found")
    

    注:

    使用的输入

    cn <- c("I", "A", "B", "C", "A", "C", "D", "P")
    
    change <- c("A", "B")
    tochange <- c("X", "Y")
    
        5
  •  1
  •   Khalid BOUSSAROUAL    1 年前

    您可以使用 ifelse 功能在 R

    cn <- c("I", "A", "B", "C", "A", "C", "D", "P")
    cn <- ifelse(cn == "A", "X", ifelse(cn == "B", "Y", cn))
    
    print(cn)
    

    或者,您可以使用 dplyr 更易读的解决方案包

    library(dplyr)
    
    cn <- c("I", "A", "B", "C", "A", "C", "D", "P")
    
    cn <- cn %>% recode("A" = "X", "B" = "Y")
    
    print(cn)
    

    输出:

    [1] "I" "X" "Y" "C" "X" "C" "D" "P"