【问题标题】:How to sequentially replace substrings in a vector with strings in another vector in R using map function?如何使用 map 函数将向量中的子字符串顺序替换为 R 中另一个向量中的字符串?
【发布时间】:2019-09-05 09:32:21
【问题描述】:

我有一个包含三个字符串的向量,它们都包含子字符串“X”:

v<- c("kpX_43", "kpX_10", "kpX_11")

“X”是一个占位符,由“1”、“2”、“3”或“a1”填充。现在,我尝试用“1”、“2”、“3”和“a1”替换“X”。此外,我必须添加一个“a”和一个“b”,从而得到以下向量:

> v_new
[1] "kp1_43a" "kp1_10a" "kp1_11a" "kp2_43a" "kp2_10a" "kp2_11a" "kp3_43a" "kp3_10a" "kp3_11a" "kp1_43b" "kpa1_10a" "kpa1_11a" "kpa1_43b" "kp1_10b" "kp1_11b" "kp2_43b" "kp2_10b" "kp2_11b" "kp3_43b" "kp3_10b" "kp3_11b" "kpa1_10b" "kpa1_11b" "kpa1_43b"

我应该使用 dyplr 和 purrr 来执行此操作。

好的,到目前为止我尝试过的内容如下:

strings<- as.matrix(c(seq(1:3), "a1"))

v_new <- v %>% 
  map(., ~str_c(., letters[seq(from = 1, to = 2)])) %>% 
  map(function(x) {
    str_replace_all(., "X" , strings)}) %>%
  unlist()

... 结果是:

> v_new
 [1] "c(\"kp1_43a\", \"kp1_43b\")"   "c(\"kp2_10a\", \"kp2_10b\")"   "c(\"kp3_11a\", \"kp3_11b\")"   "c(\"kpa1_43a\", \"kpa1_43b\")"
 [5] "c(\"kp1_43a\", \"kp1_43b\")"   "c(\"kp2_10a\", \"kp2_10b\")"   "c(\"kp3_11a\", \"kp3_11b\")"   "c(\"kpa1_43a\", \"kpa1_43b\")"
 [9] "c(\"kp1_43a\", \"kp1_43b\")"   "c(\"kp2_10a\", \"kp2_10b\")"   "c(\"kp3_11a\", \"kp3_11b\")"   "c(\"kpa1_43a\", \"kpa1_43b\")"

...有几个警告,全部阅读:

Warning messages:
1: In stri_replace_all_regex(string, pattern, fix_replacement(replacement),  :argument is not an atomic vector; coercing

所以,虽然结果已经有点接近我想要的输出,但我的代码/我的方法显然有问题。谁能帮帮我?

【问题讨论】:

    标签: r string loops replace purrr


    【解决方案1】:
    library(purrr)
    
    v <- c("kpX_43", "kpX_10", "kpX_11")
    strings <- c(1:3, "a1")
    suffixes <- c("a", "b")
    
    cross(tibble::lst(v, strings, suffixes)) %>% 
      map_chr(~ paste0(sub("X", .$strings, .$v), .$suffixes))
    #>  [1] "kp1_43a"  "kp1_10a"  "kp1_11a"  "kp2_43a"  "kp2_10a"  "kp2_11a" 
    #>  [7] "kp3_43a"  "kp3_10a"  "kp3_11a"  "kpa1_43a" "kpa1_10a" "kpa1_11a"
    #> [13] "kp1_43b"  "kp1_10b"  "kp1_11b"  "kp2_43b"  "kp2_10b"  "kp2_11b" 
    #> [19] "kp3_43b"  "kp3_10b"  "kp3_11b"  "kpa1_43b" "kpa1_10b" "kpa1_11b"
    

    reprex package (v0.2.1) 于 2019 年 4 月 15 日创建

    【讨论】:

      【解决方案2】:

      使用expand.grid,然后粘贴

      apply(expand.grid("kp",
                        c("1", "2", "3", "a1"),
                        "_",
                        c(43, 10, 11),
                        c("a", "b")), 1, paste, collapse = "")
      
      #  [1] "kp1_43a"  "kp2_43a"  "kp3_43a"  "kpa1_43a" "kp1_10a"  "kp2_10a" 
      #  [7] "kp3_10a"  "kpa1_10a" "kp1_11a"  "kp2_11a"  "kp3_11a"  "kpa1_11a"
      # [13] "kp1_43b"  "kp2_43b"  "kp3_43b"  "kpa1_43b" "kp1_10b"  "kp2_10b" 
      # [19] "kp3_10b"  "kpa1_10b" "kp1_11b"  "kp2_11b"  "kp3_11b"  "kpa1_11b"
      

      编辑:正如 Marcus 在 cmets 中所建议的:

      do.call(paste0, expand.grid("kp",
                                  c("1", "2", "3", "a1"),
                                  "_",
                                  c(43, 10, 11),
                                  c("a", "b")))
      

      【讨论】:

        【解决方案3】:

        如果您不是非常依赖 dplyr 和 purrr,您可以使用 gsub 在 base R 中执行此操作

        as.vector(sapply(strings, function(x) 
          paste0(gsub("X", x, v), rep(letters[1:2], 3))))
        # [1] "kp1_43a"  "kp1_10b"  "kp1_11a"  "kp1_43b"  "kp1_10a" 
        # [6] "kp1_11b"  "kp2_43a"  "kp2_10b"  "kp2_11a"  "kp2_43b" 
        # [11] "kp2_10a"  "kp2_11b"  "kp3_43a"  "kp3_10b"  "kp3_11a" 
        # [16] "kp3_43b"  "kp3_10a"  "kp3_11b"  "kpa1_43a" "kpa1_10b"
        # [21] "kpa1_11a" "kpa1_43b" "kpa1_10a" "kpa1_11b"
        

        【讨论】:

          【解决方案4】:

          您需要在最后一个映射中额外添加一个map 来迭代ab 并将X 替换为字符串

          library(purrr)
          v %>% map(., ~str_c(., letters[seq(from = 1, to = 2)])) %>%
                map(. %>% map(.,~str_replace_all(.,'X',strings))) %>% unlist()
                #OR map(~map(.,~str_replace_all(.,'X',strings)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-21
            • 2019-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-03
            • 1970-01-01
            • 2020-07-01
            相关资源
            最近更新 更多