Условно склеиваем строки вместе - PullRequest
1 голос
/ 28 мая 2020

Данные, которые у меня есть, представляют собой вектор с предложениями, разрезанными на части.

y <- c("G'day", "world and everybody", "else.", "How's life?", "Hope", "you're", "doing just", "fine.")

Я бы хотел снова сложить предложения.

Ожидаемый результат:

y
[1] "G'day world and everybody else."
[2] "How's life?"
[3] "Hope you're doing just fine."

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

unlist(strsplit(paste0(y[which(grepl("^[A-Z]", y))], " ", y[which(grepl("^[a-z]", y))], collapse = ","), ","))
[1] "G'day world and everybody" "How's life? else."         "Hope you're"               "G'day doing just"         
[5] "How's life? fine."

EDIT :

Пришли с этим решением, которое дает ожидаемый результат, но выглядит некрасиво:

y1 <-  c(paste0(y[grepl("^[A-Z].*[^.?]$", y, perl = T)], " ", unlist(strsplit(paste0(y[which(grepl("^[a-z]", y))], collapse = " "), "\\."))), y[grepl("^[A-Z].*[.?]$", y, perl = T)])

y1
[1] "G'day world and everybody else" "Hope  you're doing just fine"   "How's life?"

Какое решение лучше?

EDIT 2 :

Также хорошее решение:

library(stringr)
str_extract_all(paste(y, collapse = " "), "[A-Z][^.?]*(\\.|\\?)")

1 Ответ

2 голосов
/ 28 мая 2020

Я бы использовал gsub, чтобы вставить новую строку перед каждой заглавной буквы, а затем разделить на новые строки:

unlist(strsplit(gsub(" ([A-Z])", "\n\\1", paste(y, collapse = " ")), "\n"))
#> [1] "G'day world and everybody else." "How's life?"                    
#> [3] "Hope you're doing just fine."

Создано 28 мая 2020 года представителем пакет (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...