отдельная путаница с регулярными выражениями - PullRequest
1 голос
/ 14 марта 2020
 a     
 Hello abc AA
 bcc BB
 xaa X
 axd LSE

Как мне придумать регулярное выражение для этого кадра данных, чтобы я мог разделить заглавные буквы в конце

a          b
Hello abc  AA
bcc        BB
xaa        X
axd        LSE

Не уверен, почему это не сработает

 df %>%
  separate(a, c("a", "b"), " [[:upper:]]+")

1 Ответ

3 голосов
/ 14 марта 2020

Мы можем использовать регулярные выражения для этого. Здесь сопоставляемый шаблон представляет собой один или несколько пробелов (\\s+), предшествующих одному или нескольким непробельным пробелам (\\S+) до конца ($) строки

library(dplyr)
library(tidyr)
df %>%
    separate(a, into = c('a', 'b'), "\\s+(?=\\S+$)")

Или с шаблоном OP, т. Е. Для соответствия одному или нескольким пробелам (\\s+), предшествующим заглавной букве ([[:upper:]] или [A-Z])

df %>%
    separate(a, into = c('a', 'b'), "\\s+(?=[[:upper:]])")
#         a   b
#1 Hello abc  AA
#2       bcc  BB
#3       xaa   X
#4       axd LSE

Или другой вариант extract где мы фиксируем как группы

df %>% 
    extract(a, into = c('a', 'b'), '^(.*) (\\S+)$')
#          a   b
#1 Hello abc  AA
#2       bcc  BB
#3       xaa   X
#4       axd LSE

A base R, опция strsplit

do.call(rbind, strsplit(df$a, "\\s(?=[A-Z])", perl = TRUE))

Или с read.csv

read.csv(text = sub("\\s(?=[A-Z])", ',', df$a, perl = TRUE),
       header = FALSE, col.names = c('a', 'b'))

данные

df <- structure(list(a = c("Hello abc AA", "bcc BB", "xaa X", "axd LSE"
)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...