Замените несколько строк в одном выражении 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))