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
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 textogame_info
y luego utilizardplyr
para organizarlos en un nuevo marco de datos con la estructura deseada.Aquí hay un código de ejemplo que demuestra este enfoque:
El código primero utiliza
str_extract()
para extraer los elementos de fecha y hora de la columna de textogame_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 textogame_info
en dos partes utilizando la fecha y hora como delimitador. Esto crea una columna de lista llamadaequipos
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 textogame_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