Вам просто нужно использовать регулярное выражение (см. help("regex")
):
x <- c("has", "hasn't", "was", "wasn't")
sub("n't$", " not", x)
# [1] "has" "has not" "was" "was not"
Здесь мы используем специальный символ регулярного выражения $
, обозначающий конец строки. Таким образом, каждый элемент, который заканчивается в "n't"
, будет заменен "n't"
на " not"
. Это будет работать, если все элементы x
являются одним словом. Однако, если у вас есть хотя бы несколько слов, состоящих из нескольких слов, вы должны использовать \\b
, пустую строку, отмечающую край слова:
x <- c("has", "hasn't done anything", "was", "wasn't")
sub("n't\\b", " not", x)
# [1] "has" "has not done anything" "was"
# [4] "was not"
Более того, если потенциально может быть несколько таких слов в одном элементе вашего вектора, вам нужно gsub()
вместо sub()
:
x <- c("has", "hasn't", "was", "I wasn't available, so we couldn't meet")
sub("n't\\b", " not", x)
# [1] "has"
# [2] "has not"
# [3] "was"
# [4] "I was not available, so we couldn't meet"
gsub("n't\\b", " not", x)
# [1] "has"
# [2] "has not"
# [3] "was"
# [4] "I was not available, so we could not meet"
Проблема «не могу»
Как указано в комментариях, если в ваших данных может появиться слово "can't"
, вам сначала нужно изменить все его экземпляры на "cann't"
, иначе вы получите "ca not"
:
x <- "I am not available, so we can't meet"
gsub("n't\\b", " not", x)
# [1] "I am not available, so we ca not meet"
x <- gsub("can't", "cann't", x)
gsub("n't\\b", " not", x)
# [1] "I am not available, so we can not meet"