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.

No tengo idea de cómo expresar mi problema al convertir un dataframe a otro, por favor lee a continuación para más detalles. Muchas gracias.

Quiero convertir un dataframe (izquierda) en otro (derecha), pero no tengo idea de cómo hacer esta tarea. En resumen, se conservó el valor más cercano en A y se fusionó con B. Por favor, tómate tu tiempo para ayudarme. ¡Muchas gracias!

Aquí está la data original.

df1 = data.frame(
ID = c(1,1,1,1,1,1,1,1,2,2,2,2,2),
TIME = c(-2, -1, 0, 11, 13, 24, 28, 36, -3, 0, 12, 13, 24),
A = c(30, 50, NA, 80, NA, NA, 30, NA, 20, NA, NA, 80, NA),
B = c(NA, NA, 2.0, NA, 2.5, 2.5, NA, 1.0, NA, 1.0, 1.0, NA, 2.5)
)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puede utilizar el siguiente enfoque:

    Primero, agrupe el dataframe original por la columna ID utilizando la función group_by() del paquete dplyr.

    A continuación, utilice la función tidyr::fill() para rellenar hacia adelante los valores en la columna A.

    Luego, utilice la función dplyr::mutate() para calcular la distancia entre el valor actual de TIME y el valor anterior utilizando la función lag(). Luego, calcule la distancia entre el valor actual de TIME y el siguiente valor utilizando la función lead(). Finalmente, utilice la función pmin() para obtener la distancia mínima entre el valor actual de TIME y sus valores vecinos.

    Por último, utilice la función dplyr::filter() para filtrar las filas donde la columna A tiene valores perdidos.

    Aquí está el código:

    library(dplyr)
    
    df2 <- df1 %>%
      group_by(ID) %>%
      tidyr::fill(A) %>%
      mutate(
        prev_time = TIME - lag(TIME),
        next_time = lead(TIME) - TIME,
        min_dist = pmin(prev_time, next_time, na.rm = TRUE)
      ) %>%
      filter(!is.na(A))
    
    df2
    

    El dataframe resultante df2 tendrá el resultado deseado como se muestra en el lado derecho de la imagen.

Comments are closed.