Разделение строки на основе регистра букв

#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"