Извлечь домашнюю команду и выездные команды, разделенные "на" в R - PullRequest
0 голосов
/ 29 марта 2019

У меня есть вектор матчей в баскетболе колледжа:

c("#34 Colorado  at  #36 California", "#31 Utah  at  #87 Stanford", 
"#26 USC  at  #112 Wash State", "#56 UCLA  at  #134 Washington", 
"#187 W Illinois  at  #116 Neb Omaha", "#222 Denver  at  #58 S Dakota St", 
"#245 IUPUI  at  #170 South Dakota", "#268 Rice  at  #208 TX El Paso", 
"#274 North Texas  at  #344 TX-San Ant", "#14 Iowa  at  #3 Purdue"
)

Я бы хотел два отдельных вектора: один для команд до at, а другой для команд, которые появляются после at. Например, первый вектор будет иметь Colorado, Utah, USC и т. Д., А второй вектор будет иметь California, Stanford, Wash State и т. Д.

Обратите внимание, что я не хочу # рейтинга. Я просто хочу названия команд. Я пробовал str_split, но не слишком хорошо работает, так как все расстояния не согласованы.

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Другое решение с str_extract_all()

df <- data.frame(stringsAsFactors = FALSE,
                 text = c("#34 Colorado  at  #36 California", "#31 Utah  at  #87 Stanford", 
                          "#26 USC  at  #112 Wash State", "#56 UCLA  at  #134 Washington", 
                          "#187 W Illinois  at  #116 Neb Omaha", "#222 Denver  at  #58 S Dakota St", 
                          "#245 IUPUI  at  #170 South Dakota", "#268 Rice  at  #208 TX El Paso", 
                          "#274 North Texas  at  #344 TX-San Ant", "#14 Iowa  at  #3 Purdue")
)

library(stringr)
library(dplyr)

df %>% 
    mutate(team_a = str_extract_all(text, "(?<=\\s).+(?=\\s+at)"),
           team_b = str_extract_all(text, "(?<=\\d\\s)[^\\d]+$"))
#>                                     text       team_a       team_b
#> 1       #34 Colorado  at  #36 California    Colorado    California
#> 2             #31 Utah  at  #87 Stanford        Utah      Stanford
#> 3           #26 USC  at  #112 Wash State         USC    Wash State
#> 4          #56 UCLA  at  #134 Washington        UCLA    Washington
#> 5    #187 W Illinois  at  #116 Neb Omaha  W Illinois     Neb Omaha
#> 6       #222 Denver  at  #58 S Dakota St      Denver   S Dakota St
#> 7      #245 IUPUI  at  #170 South Dakota       IUPUI  South Dakota
#> 8         #268 Rice  at  #208 TX El Paso        Rice    TX El Paso
#> 9  #274 North Texas  at  #344 TX-San Ant North Texas    TX-San Ant
#> 10               #14 Iowa  at  #3 Purdue        Iowa        Purdue

Создано в 2019-03-29 пакетом Представить (v0.2.1)

1 голос
/ 29 марта 2019

Мы можем использовать strsplit и разделить на «at», что даст нам 2 части строки, и из каждой части мы уберем «#» с последующим номером и поместим его в кадр данных.

data.frame(t(sapply(strsplit(string, "\\bat\\b"), 
             function(x) trimws(sub("#[0-9]+", "", x)))))


#            X1           X2
#1     Colorado   California
#2         Utah     Stanford
#3          USC   Wash State
#4         UCLA   Washington
#5    W Illinois    Neb Omaha
#6       Denver  S Dakota St
#7        IUPUI South Dakota
#8         Rice   TX El Paso
#9  North Texas   TX-San Ant
#10        Iowa       Purdue

Или используя tidyr::separate

tidyr::separate(data.frame(col = trimws(gsub("#[0-9]+", "", string))),
        col, into = c("T1", "T2"), sep = "\\bat\\b")


#            T1                T2
#1     Colorado        California
#2         Utah          Stanford
#3          USC        Wash State
#4         UCLA        Washington
#5   W Illinois         Neb Omaha
#6       Denver       S Dakota St
#7        IUPUI      South Dakota
#8         Rice        TX El Paso
#9  North Texas        TX-San Ant
#10        Iowa            Purdue
0 голосов
/ 29 марта 2019

Мы можем сделать это в base R, удалив подстроку из столбца 'text' и используя read.csv

read.csv(text = trimws(gsub("#\\d+", "", gsub("\\s+at\\s+", ",", df$text))),
        header = FALSE, col.names = c("T1", "T2"), stringsAsFactors = FALSE)
#            T1            T2
#1     Colorado    California
#2         Utah      Stanford
#3          USC    Wash State
#4         UCLA    Washington
#5   W Illinois     Neb Omaha
#6       Denver   S Dakota St
#7        IUPUI  South Dakota
#8         Rice    TX El Paso
#9  North Texas    TX-San Ant
#10        Iowa        Purdue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...