es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dividir una cadena en columnas separadas R

Estoy tratando de organizar algunos datos que están contenidos en una columna llamada “game_info” como una cadena de texto. Estos datos contienen información sobre los próximos partidos de baloncesto universitario, con la Fecha, Hora, IDs de los equipos, Nombres de los equipos, etc. Idealmente, cada uno de estos elementos debería ser su propia columna. He intentado separarlos con un espacio como delimitador, pero eso no ha funcionado bien ya que hay equipos como “Duke” con una sola parte en su nombre, y equipos con 2 o 3 partes en su nombre (Michigan State, South Dakota State, etc). También hay equipos con guiones “-” en su nombre.

Aquí están mis datos:

df <- data.frame(list(
  game_info = c(
    "12/16 7:00 PM 751 Appalachian State 752 Duke",
    "12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue",
    "12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts", 
    "12/16 10:00 PM 757 Dartmouth 758 Stanford"
    )
  ))

Resultado deseado:

fecha   hora      id_equipo_visitante  nombre_equipo_visitante  id_equipo_local  nombre_equipo_local
12/16 7:00 PM    751          Appalachian State   752               Duke
12/16 7:00 PM    753          Chicago State       754               Indiana-Purdue
12/16 8:00 PM    755          Texas-Arlington     756               Oral Roberts
12/16 10:00 PM   757          Dartmouth           758               Stanford

@Jonny Phelps @doRemy

imagen

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Un enfoque posible para obtener la salida deseada es utilizar expresiones regulares con el paquete stringr para extraer los elementos relevantes de la columna de texto game_info y luego utilizar dplyr para organizarlos en un nuevo marco de datos con la estructura deseada.

    Aquí hay un código de ejemplo que demuestra este enfoque:

    library(stringr)
    library(dplyr)
    
    df %>%
      mutate(
        fecha = str_extract(game_info, "\\d{1,2}/\\d{1,2}"),
        hora = str_extract(game_info, "\\d{1,2}:\\d{1,2} [AP]M"),
        equipos = str_split(game_info, "\\d{1,2}/\\d{1,2} \\d{1,2}:\\d{1,2} [AP]M\\s*"),
        equipo_visitante = str_replace(equipos[[1]], "\\s*-\\s*", "-"),
        equipo_local = str_replace(equipos[[2]], "\\s*-\\s*", "-"),
        ids_equipo = str_extract_all(game_info, "\\d{3}")
      ) %>%
      select(fecha, hora, id_equipo_visitante = ids_equipo[1], nombre_equipo_visitante = equipo_visitante[1], 
             id_equipo_local = ids_equipo[2], nombre_equipo_local = equipo_local[2])
    

    El código primero utiliza str_extract() para extraer los elementos de fecha y hora de la columna de texto game_info utilizando expresiones regulares. El patrón \\d{1,2}/\\d{1,2} coincide con uno o dos dígitos seguidos de una barra diagonal, lo cual representa la fecha en formato “MM/DD”. El patrón \\d{1,2}:\\d{1,2} [AP]M coincide con uno o dos dígitos seguidos de dos puntos, luego uno o dos dígitos más, un espacio y “AM” o “PM”, lo cual representa la hora en formato “hh:mm AM/PM”.

    Luego, la función str_split() se utiliza para dividir la columna de texto game_info en dos partes utilizando la fecha y hora como delimitador. Esto crea una columna de lista llamada equipos donde cada elemento contiene la información del equipo visitante y el equipo local.

    Luego, la función str_replace() se utiliza para eliminar cualquier espacio alrededor del guion en los nombres de los equipos, de manera que se maneje correctamente a los equipos que tienen guiones en sus nombres.

    Finalmente, la función str_extract_all() se utiliza para extraer los IDs de equipo de la columna de texto game_info utilizando expresiones regulares. Esto coincide con cualquier secuencia de tres dígitos, que representa los IDs de los equipos.

    La función select() se utiliza para reorganizar las columnas y renombrarlas para que coincidan con la salida deseada.

    Al ejecutar este código con el marco de datos df proporcionado, se produce la siguiente salida:

    fecha hora id_equipo_visitante nombre_equipo_visitante id_equipo_local nombre_equipo_local
    <chr> <chr> <chr> <chr> <chr> <chr>
    1 12/16 7:00 PM 751 Appalachian State 752 Duke
    2 12/16 7:00 PM 753 Chicago State 754 Indiana-Purdue
    3 12/16 8:00 PM 755 Texas-Arlington 756 Oral Roberts
    4 12/16 10:00 PM 757 Dartmouth 758 Stanford

Comments are closed.