#r
#r
Вопрос:
Я хочу разделить следующую строку
"ATextIWantToDisplayWithSpaces"
вот так
A Text I Want To Display With Spaces.
Я попробовал этот код в R
strsplit(x="ATextIWantToDisplayWithSpaces", split=[:upper:])
что приводит к этой ошибке
Error: unexpected '[' in "strsplit(x="ATextIWantToDisplayWithSpaces", split=["
Любая помощь будет высоко оценена. Спасибо
Ответ №1:
Просто сделайте это. Он работает, (а) размещая букву верхнего регистра, (б) записывая ее в группу и (в) заменяя ее на ту же букву с пробелом перед ней.
gsub('([[:upper:]])', ' \1', x)
Комментарии:
1. отлично! Вот небольшая модификация путем удаления первого пробела:
gsub("(?!^)(?=[[:upper:]])", " ", x, perl=T)
2.
gsub('([[:upper:]])', ' \1', x)
поставьте дополнительный пробел в начале, если первая буква в верхнем регистре, ноgsub("(?!^)(?=[[:upper:]])", " ", x, perl=T)
не делайте этого.3. или это, которое также не вставляет пробел в начале:
gsub("(.)([[:upper:]])", "\1 \2", x)
4. Это также предотвращает первый пробел, не требуя
perl
флага, путем сопоставления не с границей:gsub('\B([[:upper:]])', ' \1', x)
Ответ №2:
Ответ на ваш конкретный вопрос («как мне разделить на прописные буквы»?)
strsplit(x="ATextIWantToDisplayWithSpaces", split="[[:upper:]]")
но ответ @Ramnath — это то, что вы на самом деле хотите. strsplit
отбрасывает символы, на которые она разбивается. splitByPattern
Функция from R.utils
ближе, но она все равно не вернет результаты в наиболее удобной для вас форме.
Комментарии:
1. Ого! На этот раз ты меня понял. 🙂
2. @BenBolker: Спасибо за ваш ответ. Комментарий kohske более гибкий.
3. Это отвечает на конкретный вопрос:
strsplit(x, "(?!^)(?=[[:upper:]])", perl=T)
. (Однако я хотел бы знать, почему это не совсем работает :strsplit(x, "(?=[[:upper:]])", perl=T)
. В частности, почему он терпит неудачу так, как это происходит?) @kohske — как местный гуру регулярных выражений, у вас есть какое-то понимание?
Ответ №3:
Я знаю, что это старое решение, но я адаптировал приведенное выше решение к тому, которое у меня было, где мне нужно было разделить значения столбца во фрейме данных на верхний регистр, а затем сохранить только второй элемент. В этом решении используются dplyr и purrr:
df %>% mutate(stringvar= map(strsplit(stringvar, "(?!^)(?=[[:upper:]])", perl=T),~.x[2]) %>% unlist())
Ответ №4:
Использование stringr
library(stringr)
str_replace_all(
string = "ATextIWantToDisplayWithSpaces",
pattern = "([[:upper:]])",
replacement = " \1"
) %>%
str_trim()
#[1] "A Text I Want To Display With Spaces"