stringr:通过字符向量提供模式来替换字符串

时间:2018-05-14 22:19:25

标签: r tidyverse stringr

这是我的数据:

df <- tibble::tribble(
         ~A,  ~B,
        "C", "G",
        "D", "H",
        "E", "I",
        "F", "J")

value1 <- "D"

value2 <- "C"

而且,在变量A中,我想用“m”和“n”替换D和C,就像这样,但它不起作用!

df %>% mutate(X = A %>% str_replace_all(c(value1 = "m", value2 = "n")))

我想要的输出是:

df %>% mutate(X = A %>% str_replace_all(c("D" = "m", "C" = "n")))

但是我没有手动提供“D”和“C”,而是想以编程方式提供这些,使用value1和value2符合......

我该怎么做?

4 个答案:

答案 0 :(得分:2)

您可以尝试使用setNames设置mn的名称,如:

library(dplyr)
library(stringr)
df %>% mutate(X = A %>% str_replace_all(setNames(c("m","n"), c(value1, value2))))

# A tibble: 4 x 3
#  A     B     X    
#  <chr> <chr> <chr>
#1 C     G     n    
#2 D     H     m    
#3 E     I     E    
#4 F     J     F  

然后检查它是否等于您想要的结果:

identical(
          df %>% mutate(X = A %>% str_replace_all(c("D" = "m", "C" = "n"))),
          df %>% mutate(X = A %>% str_replace_all(setNames(c("m","n"), c(value1, value2)))))
#[1] TRUE

我还包括您使用的其他软件包:dplyr和stringr

答案 1 :(得分:1)

您可以考虑创建一个命名向量并将其用作替换向量。

replacementVector <- c("m","n")
names(replacementVector) <- c("D","C")

现在,使用replacementVector链中的dplyrifelse作为:

df %>% mutate(X = ifelse(is.na(replacementVector[A]), A, replacementVector[A]))

# # A tibble: 4 x 3
# A     B     X    
# <chr> <chr> <chr>
# 1 C     G     n    
# 2 D     H     m    
# 3 E     I     E    
# 4 F     J     F

数据:

library(tidyverse)
df <- tibble::tribble(
  ~A,  ~B,
  "C", "G",
  "D", "H",
  "E", "I",
  "F", "J")

答案 2 :(得分:1)

如果将所有值放在同一个向量中,则可以在字符串和替换上进行矢量化,只需运行

即可
df %>% mutate(X = A %>% str_replace_all(c("C","D"), c("m","n")))

答案 3 :(得分:1)

我们可以使用chartr

df %>% 
  mutate(X = chartr('DC', 'mn', A))
# A tibble: 4 x 3
#   A     B     X    
#  <chr> <chr> <chr>
#1 C     G     n    
#2 D     H     m    
#3 E     I     E    
#4 F     J     F