Разделить DF на несколько столбцов - PullRequest
1 голос
/ 01 мая 2020

У меня есть столбец, который я хочу разделить на несколько столбцов. Я не так хорошо знаком с regexp, поэтому я не уверен в правильном способе go по этому поводу.

Пример данных

df <- tibble::tribble(
                  ~player,
    "Eloy Jimenez OF CHW",
  "Fernando Tatis Jr SS SD"
  )

Я хочу разбить столбец, где начинаются заглавные буквы. Например:

output_df <- tibble::tribble(
  ~col1, col2, col3,
  "Eloy Jimenez", "OF", "CHW",
  "Fernando Tatis Jr", "SS", "SD"
)

Заранее спасибо.

Ответы [ 3 ]

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

Мы можем использовать extract из tidyr для захвата символов в верхнем регистре с конца строки

library(stringr)
library(tidyr)
df %>% 
   extract(player, into = str_c('col', 1:3), '^(.*)\\s+([A-Z]+)\\s+([A-Z]+)$')
# A tibble: 2 x 3
#  col1              col2  col3 
#  <chr>             <chr> <chr>
#1 Eloy Jimenez      OF    CHW  
#2 Fernando Tatis Jr SS    SD   

Или с strcapture из base R

strcapture('^(.*)\\s+([A-Z]+)\\s+([A-Z]+)$', df$player,
   data.frame(col1 = character(), col2 = character(), col3 = character()))
#               col1 col2 col3
#1      Eloy Jimenez   OF  CHW
#2 Fernando Tatis Jr   SS   SD
0 голосов
/ 02 мая 2020

Или используя data.table

library(data.table)
df <- tibble::tribble(
  ~player,
  "Eloy Jimenez OF CHW",
  "Fernando Tatis Jr SS SD"
)

setDT(df)

df[,tstrsplit(player,split=" (?=[A-Z]{2,})",perl=TRUE)]
#>                   V1 V2  V3
#> 1:      Eloy Jimenez OF CHW
#> 2: Fernando Tatis Jr SS  SD

Или tidyr

tidyr::separate(df,player,sep=" (?=[A-Z]{2,})",into=paste0("V",1:3))
0 голосов
/ 01 мая 2020

Вы можете использовать lookarounds. Надеюсь, что это продвигает вас вперед:

library(stringr)
str_split(string = "Eloy Jimenez OF CHW",
          pattern =  "( ?=([:upper:]{2,}))") %>% 
  unlist() %>% 
  trimws() %>% 
  stri_remove_empty()
...