Отдельный столбец, сопоставляя строки - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть кадр данных, который выглядит примерно так:

name_position
RAHEEM STERLINGForward
MARCUS RASHFORDForward
JORDAN HENDERSONMidfielder
JORDAN PICKFORDGoalkeeper
KYLE WALKERDefender

Моя цель - создать два столбца этого предыдущего, поэтому я создал вектор, содержащий все доступные позиции

positions <- c("Goalkeeper", "Defender", "Midfielder", "Forward")

Тогда я пробовал использовать такие функции, как separate(), extract() или даже str_match, но я не могу получить желаемый результат достичь, что бы выглядеть так:

name                   position
RAHEEM STERLING        Forward
MARCUS RASHFORD        Forward
JORDAN HENDERSON       Midfielder
JORDAN PICKFORD        Goalkeeper
KYLE WALKER            Defender

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Использование str_extract из stringr:

df1$position <- str_extract(df1$name_position, "(?<=[A-Z])[A-Z][a-z]+")

Результат:

df1
               name_position   position
1     RAHEEM STERLINGForward    Forward
2     MARCUS RASHFORDForward    Forward
3 JORDAN HENDERSONMidfielder Midfielder
4  JORDAN PICKFORDGoalkeeper Goalkeeper
5        KYLE WALKERDefender   Defender

В этом решении используется положительный вид сзади:

(?<=[A-Z]), если вы видите заглавная буква слева ...

[A-Z][a-z]+ ... соответствует следующей заглавной букве плюс одна или несколько строчных букв, следующих за ней

2 голосов
/ 17 апреля 2020

Мы можем использовать separate с поиском регулярных выражений

library(dplyr)
library(tidyr)
df1 %>%
  separate(name_position, into = c("name", "position"), 
           sep="(?<=[A-Z])(?=[A-Z][a-z])")
#             name   position
#1  RAHEEM STERLING    Forward
#2  MARCUS RASHFORD    Forward
#3 JORDAN HENDERSON Midfielder
#4  JORDAN PICKFORD Goalkeeper
#5      KYLE WALKER   Defender

Если у нас есть собственный вектор, то одним из вариантов является создание вектора-терна pat путем создания одной строки

library(stringr)
pat <- str_c(positions, collapse="|")
df1 %>% 
   transmute(name = str_remove(name_position, pat),
            position = str_extract(name_position, pat))

данные

df1 <- structure(list(name_position = c("RAHEEM STERLINGForward", "MARCUS RASHFORDForward", 
"JORDAN HENDERSONMidfielder", "JORDAN PICKFORDGoalkeeper", 
"KYLE WALKERDefender"
)), class = "data.frame", row.names = c(NA, -5L))
...