Замените несколько строк в одном выражении gsub() или chartr() в R?

У меня есть строковая переменная, содержащая алфавит [a-z], пробел [] и апостроф ['], например. x <- "a'b c" Я хочу заменить апостроф ['] пустым [] и заменить пробел [] на знак подчеркивания [_].

x <- gsub("'", "", x)
x <- gsub(" ", "_", x)

Это работает абсолютно, но когда у меня много условий, код становится уродливым. Поэтому я хочу использовать chartr(), но chartr() не может обрабатывать пробел, например.

x <- chartr("' ", "_", x) 
#Error in chartr("' ", "_", "a'b c") : 'old' is longer than 'new'

Есть ли способ решить эту проблему? спасибо!

Ответ 1

Вы можете использовать gsubfn

library(gsubfn)
gsubfn(".", list("'" = "", " " = "_"), x)
# [1] "ab_c"

Точно так же мы можем также использовать mgsub который позволяет многократную замену с несколькими шаблонами

mgsub::mgsub(x, c("'", " "), c("", "_"))
#[1] "ab_c"

Ответ 2

Я являюсь поклонником синтаксиса, который предоставляют операторы %<>% и %>% из пакета magrittr.

library(magrittr)

x <- "a'b c"

x %<>%
  gsub("'", "", .) %>%
  gsub(" ", "_", .) 
x
##[1] "ab_c"

gusbfn замечательно, но мне нравится привязка %>%.

Ответ 3

Я бы выбрал решение magrittr и/или dplyr. Однако я предпочитаю не создавать новую копию объекта, особенно если он находится в функции и может быть возвращен дешево.

то есть.

return(
  catInTheHat %>% gsub('Thing1', 'Thing2', .) %>% gsub('Red Fish', 'Blue 
    Fish', .)
)

... и т.д.

Ответ 4

gsub("\\s", "", chartr("' ", " _", x)) # Use whitespace and then remove it

Ответ 5

Я думаю, что вложенный gsub сделает эту работу.

gsub("Find","Replace",gsub("Find","Replace",X))