stringr: заменить строку, указав шаблон через символьный вектор - PullRequest
0 голосов
/ 15 мая 2018

Вот мои данные:

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

value1 <- "D"

value2 <- "C"

И в переменной A я хочу заменить D и C на "m" и "n", что-то вроде этого, но это не работает!

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 голосов
/ 15 мая 2018

Мы могли бы использовать 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   
0 голосов
/ 15 мая 2018

Вы можете создать именованный вектор и использовать его в качестве вектора замены.

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

Теперь используйте цепочку replacementVector in dplyr вместе с ifelse как:

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")
0 голосов
/ 15 мая 2018

Как векторизовано для строки и замены, если вы поместите все значения в один вектор, вы можете просто запустить

df %>% mutate(X = A %>% str_replace_all(c("C","D"), c("m","n")))
0 голосов
/ 15 мая 2018

Вы можете попробовать использовать setNames, чтобы задать имена m и n, например:

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

...