У меня есть следующий вектор символов:
vec1 <- c("D R JOHNSON", "NICE W E A T H E R")
Этот вектор содержит последовательные серии одиночных букв, таких как «DR», и я НЕ хочу, чтобы между ними были пробелы. Например, мне нужен этот вектор:
vec2 <- c("DR JOHNSON", "NICE WEATHER")
Есть ли способ, чтобы при наличии последовательной серии отдельных букв, например "W E A T H E R", я мог удалить пробелы между ними, чтобы получить "WEATHER"?





Вы можете использовать взгляд вперед (?=) и взгляд назад (?<=) с границами (\\b):
gsub("(?<=\\b[a-zA-Z]\\b)\\s(?=\\b[a-zA-Z]\\b)", "", vec1, perl=TRUE)
"DR JOHNSON" "NICE WEATHER"
короче, может быть "(?<=\\b\\S\\b)\\s(?=\\b\\S\\b)"?
Да, но я сосредоточился на "последовательной серии одиночных букв"
Разделите пространство, создайте идентификатор группы на основе последовательного количества символов, затем вставьте со свертыванием, если количество символов равно 1:
f <- function(x){
s <- unlist(strsplit(x, split = " "))
paste(sapply(split(s, data.table::rleid(nchar(s))),
function(i) {
if (nchar(i)[1] == 1) paste(i, collapse = "") else i
}),
collapse = " ")
}
sapply(vec1, f, USE.NAMES = FALSE)
# [1] "DR JOHNSON" "NICE WEATHER"
Это не совсем правильно. Обратите внимание, что некоторые слова нельзя объединять, поскольку они состоят из отдельных букв. например
I A M G O OD.и т. д. Не существует общего кода, который правильно объединил бы ваши слова.