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.

Combina lapply y gsub para reemplazar una lista de valores por otra lista de valores.

Actualmente estoy buscando una forma de simplificar la búsqueda a través de una columna dentro de un dataframe para un vector de valores y reemplazar cada uno de esos valores con otro valor (también contenido en un vector separado). Puedo hacer esto con un bucle for, pero debe ser posible dentro de la familia apply, simplemente no lo veo aún. Soy muy nuevo en el uso de la familia apply y podría usar ayuda.

Hasta ahora, he logrado que reemplace todas las instancias del primer valor en mi vector con el nuevo primer valor en el nuevo vector, solo que no itera más allá del primer nivel. Espero que esto tenga sentido. Aquí está el código que tengo:

#estandarizar la ubicación del tanque
old_tank_list <- c("7.C.4","7.C.5","7.C.6","7.C.7","7.C.8","7.C.9","7.C.10","7.C.11")
new_tank_list <- c("7.B.3-4","7.C.3-4","7.C.1-2","7.C.5-6","7.C.7-8","7.C.9-10","7.E.9-10","7.C.11-12")

sapply(df_growth$Tank,function(y) gsub(old_tank_list,new_tank_list,y))

Tanque es el nombre de la columna en la que estoy tratando de reemplazar todos estos valores. Aún no lo he asignado de nuevo, porque quiero probar la funcionalidad primero. Gracias por cualquier ayuda que puedas ofrecer.

Espero que esta imagen sea útil. La foto de la izquierda es la columna antes de aplicar mi función. La columna de la derecha es después. Básicamente, solo quiero cambiar valores de texto en lotes.

Antes y Después: Imagen

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para simplificar la búsqueda a través de una columna dentro de un marco de datos para un vector de valores y reemplazar cada uno de esos valores por otro valor, puedes usar la función match() para encontrar los índices de los elementos coincidentes en old_tank_list y luego reemplazar los valores en esos índices con los valores correspondientes de new_tank_list. Aquí tienes un ejemplo:

    #estandarizar la ubicación del tanque
    old_tank_list <- c("7.C.4","7.C.5","7.C.6","7.C.7","7.C.8","7.C.9","7.C.10","7.C.11")
    new_tank_list <- c("7.B.3-4","7.C.3-4","7.C.1-2","7.C.5-6","7.C.7-8","7.C.9-10","7.E.9-10","7.C.11-12")
    
    # encontrar índices coincidentes
    idx <- match(df_growth$Tank, old_tank_list)
    
    # reemplazar valores en los índices coincidentes
    df_growth$Tank[idx] <- new_tank_list[idx]
    

    Este código encuentra los índices de los elementos en old_tank_list que coinciden con los elementos en la columna Tank de df_growth. Luego utiliza esos índices para reemplazar los valores correspondientes en Tank con los valores de new_tank_list.

    Este enfoque es más sencillo que usar bucles o la familia de funciones apply(), y debe ser más eficiente para marcos de datos grandes.

Comments are closed.