Disculpas si el título es un poco extenso, espero que este ejemplo sea útil. Tengo el siguiente conjunto de datos:

my_df
                                     Description thisYVal thisPts
1                     (12:00)   Start Period        0       0
2        (12:00)   Jump Ball Thomas vs Grant        0       0
3      (11:48) [MIA 3-] Wade Layup Shot: Missed     0       2
4  (11:46) [PHL] Thomas Rebound (Off: Def:1)        0       0
6     (11:02) [MIA] Haslem Jump Shot: Missed      -19       2
7  (11:00) [MIA] Haslem Rebound (Off:1 Def:)        0       0
8    (10:57) [MIA] Haslem Layup Shot: Missed        0       2
9 (10:56) [PHL] Coleman Rebound (Off: Def:1)        0       0

dput(my_df)
structure(list(Description = c("(12:00)   Start Period", "(12:00)   Jump Ball Thomas vs Grant", 
"(11:48) [MIA 3-] Wade Layup Shot: Missed", "(11:46) [PHL] Thomas Rebound (Off: Def:1)", 
"(11:02) [MIA] Haslem Jump Shot: Missed", "(11:00) [MIA] Haslem Rebound (Off:1 Def:)", 
"(10:57) [MIA] Haslem Layup Shot: Missed", "(10:56) [PHL] Coleman Rebound (Off: Def:1)"
), thisYVal = c(0L, 0L, 0L, 0L, -19L, 0L, 0L, 0L), thisPts = c(0L, 
0L, 2L, 0L, 2L, 0L, 2L, 0L)), row.names = c(1L, 2L, 3L, 4L, 6L, 
7L, 8L, 9L), class = "data.frame")

... y me gustaría extraer la abreviatura del equipo de 3 letras que aparece en la columna Description del marco de datos.

La descripción de 3 letras siempre sigue al primer corchete de apertura [, aunque no siempre va seguido del corchete de cierre ] (como puede ver en la fila 3 del marco de datos).

He estado tratando de hacer esto usando la función substr () pero hasta ahora no he tenido suerte. Cualquier ayuda es apreciada!

EDITAR: algún contexto adicional: algunas filas (1 y 2, en este caso) no tienen una abreviatura [] o de equipo. En estos casos, el marco de datos podría devolver una cadena en blanco, un NA u otra cosa.

EDIT-2: solo en caso de que no se mencionara explícitamente, una cuarta columna con c("", "", "MIA", "PHL", "MIA", "MIA", "MIA", "PHL") es lo que estoy tratando de obtener

Edit-3: lo siguiente me acerca, pero no del todo

my_df %>% 
  dplyr::mutate(teamAbb = unlist(stringr::str_extract(Description, "\\[(.*)\\]")))
0
Canovice 10 sep. 2018 a las 01:47

3 respuestas

La mejor respuesta

Puede usar str_match desde {{X1} } paquete. Específicamente, querrá buscar tres letras en mayúscula (suponiendo que todas las abreviaturas del equipo son tres letras) después de un corchete izquierdo.

> str_match(df$Description, '\\[([A-Z]{3})')
     [,1]   [,2] 
[1,] NA     NA   
[2,] NA     NA   
[3,] "[MIA" "MIA"
[4,] "[PHL" "PHL"
[5,] "[MIA" "MIA"
[6,] "[MIA" "MIA"
[7,] "[MIA" "MIA"
[8,] "[PHL" "PHL"

Notarás que el patrón de abreviatura del equipo está realmente entre paréntesis; Eso es porque es un subgrupo del patrón que queremos extraer. Como tal, str_match devuelve (1) el patrón completo y (2) los subgrupos especificados entre paréntesis. Por lo tanto, en este caso, queremos tomar la segunda columna, que contiene coincidencias del subgrupo primer .

df$Team <- str_match(df$Description, '\\[([A-Z]{3})')[,2]

Esto nos da el resultado deseado:

                                 Description Team
1                     (12:00)   Start Period <NA>
2        (12:00)   Jump Ball Thomas vs Grant <NA>
3  (11:48) [MIA 3-] Wade Layup Shot: Missed   MIA
4  (11:46) [PHL] Thomas Rebound (Off: Def:1)  PHL
5     (11:02) [MIA] Haslem Jump Shot: Missed  MIA
6  (11:00) [MIA] Haslem Rebound (Off:1 Def:)  MIA
7    (10:57) [MIA] Haslem Layup Shot: Missed  MIA
8 (10:56) [PHL] Coleman Rebound (Off: Def:1)  PHL
1
cpander 9 sep. 2018 a las 23:06

R presentó recientemente strcapture a su paquete estándar utils:

strcapture("(?<=\\[)(.{3})", dat$Description, proto=list(out=character()), perl=TRUE)
#   out
#1 <NA>
#2 <NA>
#3  MIA
#4  PHL
#5  MIA
#6  MIA
#7  MIA
#8  PHL
2
thelatemail 9 sep. 2018 a las 23:38

Aquí hay otra opción que busca 3 no dígitos después de un paréntesis y los coloca en una nueva columna llamada Equipo:

library(tidyverse)

df %>% mutate(Team = str_extract(Description, "(?<=\\[)\\D{3}"))
#>                                  Description thisYVal thisPts Team
#> 1                     (12:00)   Start Period        0       0 <NA>
#> 2        (12:00)   Jump Ball Thomas vs Grant        0       0 <NA>
#> 3   (11:48) [MIA 3-] Wade Layup Shot: Missed        0       2  MIA
#> 4  (11:46) [PHL] Thomas Rebound (Off: Def:1)        0       0  PHL
#> 5     (11:02) [MIA] Haslem Jump Shot: Missed      -19       2  MIA
#> 6  (11:00) [MIA] Haslem Rebound (Off:1 Def:)        0       0  MIA
#> 7    (10:57) [MIA] Haslem Layup Shot: Missed        0       2  MIA
#> 8 (10:56) [PHL] Coleman Rebound (Off: Def:1)        0       0  PHL

Creado el 09-09-2018 por reprex paquete (v0.2.0).

1
AndS. 9 sep. 2018 a las 23:26