(提取/分离/匹配)组中的任何顺序

rsy*_*ian 5 regex r stringr tidyr tidyverse

# Sample Data Frame
df  <- data.frame(Column_A 
                  =c("1011 Red Cat", 
                     "Mouse 2011 is in the House 3001", "Yellow on Blue Dog walked around Park"))
Run Code Online (Sandbox Code Playgroud)

我有一列试图清除的手动输入数据。

  Column_A 
1|1011 Red Cat                         |
2|Mouse 2011 is in the House 3001      |
2|Yellow on Blue Dog walked around Park|  
Run Code Online (Sandbox Code Playgroud)

我想将每个特征分成其自己的列,但仍保留列A以在以后提取其他特征。

  Colour               Code           Column_A
1|Red                 |1001          |Cat
2|NA                  |2001 3001     |Mouse is in the House
3|Yellow on Blue      |NA            |Dog walked around Park
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直在用gsub重新排列它们并捕获组,然后使用Tidyr :: extract分离它们。

library(dplyr)
library(tidyr)
library(stringr)

df1 <- df %>% 

  # Reorders the Colours
  mutate(Column_A = gsub("(.*?)?(Yellow|Blue|Red)(.*)?", "\\2 \\1\\3", 
                         Column_A, perl = TRUE)) %>%
  # Removes Whitespaces 
  mutate(Column_A =str_squish(Column_A)) %>%
  # Extracts the Colours 
  extract(Column_A, c("Colour", "Column_A"), "(Red|Yellow|Blue)?(.*)") %>%

  # Repeats the Prececding Steps for Codes
  mutate(Column_A = gsub("(.*?)?(\\b\\d{1,}\\b)(.*)?", "\\2 \\1\\3", 
                         Column_A, perl = TRUE)) %>%
  mutate(Column_A =str_squish(Column_A)) %>%
  extract(Column_A, c("Code", "Column_A"), "(\\b\\d{1,}\\b)?(.*)") %>%
  mutate(Column_A = str_squish(Column_A))
Run Code Online (Sandbox Code Playgroud)

结果如下:

Colour      Code    Column_A
|Red        |1011   |Cat
|Yellow     |NA     |on Blue Dog walked around Park
|NA         |1011   |Mouse is in the House 1001
Run Code Online (Sandbox Code Playgroud)

这对于第一行工作正常,但不适用于行进空间和单词分隔的行,我随后一直在提取和合并它们。有什么更优雅的方法?