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.

Encuentre la distancia mínima (“Dist_km”) para cada ID de entrada al ID de objetivo, donde la distancia mínima solo se puede usar una vez.

Tengo un archivo con 945 IDs de entrada únicos, y cada uno de estos IDs de entrada tiene una distancia calculada a 1435 IDs de destino únicos. Necesito encontrar la distancia mínima al ID de destino para cada ID de entrada. La distancia se calcula en la columna “Distkm” (consulte el ejemplo de datos adjunto). El cálculo debe comenzar desde el ID de entrada más bajo (es decir, de 1 a 945 en adelante). Es importante tener en cuenta que si se encuentra la distancia mínima (“Distkm”) para el ID de entrada más bajo, este no puede ser utilizado nuevamente y debe asignarse el siguiente ID de destino más cercano. Esto significa que, si los IDs de entrada “3” y “6” están más cerca del ID de destino 93112261, entonces se asigna el ID de destino 93112261 al ID de entrada “3”, y se deben encontrar otros ID de destino más cercanos para “6”.

InputID TargetID Dist_km
1 93112261 82.20803
1 93112285 73.93768
945 93263357 283.92473
945 92190485 129.49177 |
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para encontrar la distancia mínima al TargetID para cada InputID, en R podemos utilizar los siguientes pasos:

    1. Leer los datos en R como un dataframe usando read.table().
    data <- read.table("ruta/al/archivo.csv", header = TRUE, sep = ",")
    
    1. Ordenar los datos por InputID en orden ascendente.
    data <- data[order(data$InputID), ]
    
    1. Crear un vector vacío para almacenar los TargetID asignados y otro vector vacío para hacer un seguimiento de los TargetID utilizados.
    assigned_targets <- rep(NA, nrow(data))
    used_targets <- numeric()
    
    1. Recorrer cada InputID y encontrar el TargetID no utilizado más cercano.
    for (i in 1:nrow(data)) {
      # Filtrar los datos para incluir sólo los TargetID no utilizados
      available_targets <- data$TargetID[!(data$TargetID %in% used_targets)]
      # Encontrar el índice del TargetID más cercano
      closest_target_index <- which.min(data$Dist_km[data$InputID == data$InputID[i] &
                                                         data$TargetID %in% available_targets])
      # Asignar el TargetID más cercano al InputID y marcarlo como utilizado
      assigned_targets[i] <- data$TargetID[data$InputID == data$InputID[i] &
                                           data$TargetID %in% available_targets][closest_target_index]
      used_targets <- c(used_targets, assigned_targets[i])
    }
    
    1. Añadir los TargetID asignados al dataframe original y escribir los resultados en un nuevo archivo.
    data$Assigned_TargetID <- assigned_targets
    write.table(data, "ruta/al/nuevo_archivo.csv", row.names = FALSE, sep = ",")
    

    El dataframe resultante tendrá el TargetID con la distancia mínima asignado a cada InputID en la columna “Assigned_TargetID”.

Comments are closed.