str_replace_all by position,应用于矢量

时间:2017-09-08 20:53:22

标签: r tidyverse stringr purrr

我有一个数据框,其中每个条目都是一些字符串,用逗号分隔。我想用一种巧妙的方法来替换每个元素。

这是数据的玩具版本

 library(tidyverse)

d1 <- tibble(
  r1 = c("lab1",
         "lab2,lab3",
         NA,
         "lab3,lab4"),
  r2 = c(NA,
         "lab1",
         "lab2",
         "lab2,lab3")
  ) 

所以我希望每个lab元素都被相应的rep元素替换。

d1 %>% 
  modify_at(1:2,
        ~ str_replace_all(.,
                          c("lab1", "lab2", "lab3", "lab4"),
                          c("rep1", "rep2", "rep3", "rep4")))

返回

# A tibble: 4 x 2
         r1        r2
      <chr>     <chr>
1      rep1      <NA>
2 rep2,lab3      lab1
3      <NA>      lab2
4 lab3,rep4 lab2,lab3

所以我只在r1中为每个单元格做了一次替换,而我需要全部替换它们。

3 个答案:

答案 0 :(得分:5)

这应该有效

  d1 %>% 
      modify_at(1:2,
                ~ stringr::str_replace_all(.,
                                           c("lab1" = "rep1",
                                             "lab2" = "rep2",
                                             "lab3" = "rep3",
                                             "lab4" = "rep4")))

要在字符串的每个元素中执行多次替换,请将命名向量(c(pattern1 = replacement1))传递给str_replace_all

答案 1 :(得分:3)

您可以使用multigsub包中的qdap

library(qdap)

d1 %>% 
  modify_at(1:2,
            ~ multigsub(c("lab1", "lab2", "lab3", "lab4"),
                        c("rep1", "rep2", "rep3", "rep4"),
                        .))
         r1        r2
1      rep1      <NA>
2 rep2,rep3      rep1
3      <NA>      rep2
4 rep3,rep4 rep2,rep3

如果您的真实用例只需要将lab替换为rep,则无论后面是多少,您都可以这样做:

map_df(d1, ~ gsub("lab", "rep", .x))

答案 2 :(得分:1)

使用stringi - 包:

library(stringi)

patt <- c("lab1", "lab2", "lab3", "lab4")
repl <- c("rep1", "rep2", "rep3", "rep4")

d1[] <- lapply(d1, stri_replace_all_fixed, patt, repl, vectorize_all = FALSE)

结果:

> d1
         r1        r2
1      rep1      <NA>
2 rep2,rep3      rep1
3      <NA>      rep2
4 rep3,rep4 rep2,rep3