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.

Utilizando la función “pivot longer” para colapsar datos de múltiples columnas.

He leído varios mensajes similares y tutoriales pero realmente estoy luchando por entender la solución a mi problema. Tengo un conjunto de datos que es ancho, y cuando lo hago más largo – quiero combinar dos conjuntos de datos (tanto la duración como los resultados).

Para cada participante (id), hay una categoría y luego una serie de resultados de pruebas de sangre. Cada prueba tiene tanto la duración (en días) como un resultado (valor numérico).

Así es como se ve ahora:

id categoría duración1 resultados1 duración2 resultados2 duración3 resultados3
01 diabético 58 32 65 56 76 87
02 prediabético 54 32 65 25 76 35
03 desconocido 46 65 65 56 21 67

Cómo me gustaría que fuera es:

id categoría duración resultados
01 diabético 58 32
01 diabético 65 56
01 diabético 76 87
02 prediabético 54 32
02 prediabético 65 25
02 prediabético 76 35
03 desconocido 46 65
03 desconocido 65 25
03 desconocido 21 67

Puedo hacer que pivot_longer funcione para “resultados”, pero no puedo hacer que funcione para “resultados” y “duración”.

Cualquier ayuda sería muy apreciada. Soy todavía bastante nuevo en R.
¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el formato deseado, podemos usar el paquete tidyr en R. Específicamente, podemos utilizar la función pivot_longer() para convertir los datos del formato ancho al formato largo, y luego separar las columnas duration y results utilizando la función separate().

    Aquí está el código para lograr el formato deseado:

    library(tidyr)
    
    df_long <- df %>%
      pivot_longer(cols = -c(id, category), 
                   names_to = c(".value", "test_number"), 
                   names_pattern = "(.*)_(.*)") %>%  # separar los nombres de las columnas en 'duration' y 'results'
      arrange(id, test_number) %>%   # ordenar por id y número de prueba
      select(-test_number) %>%   # eliminar la columna test_number
      separate(duration, c("duration", "test_number"), sep = "_") %>%   # separar la columna duration en 'duration' y 'test_number'
      select(id, category, duration, results)   # seleccionar las columnas finales en el orden deseado
    
    df_long
    

    Explicación de cada paso:

    1. Utilizar pivot_longer() para transformar los datos del formato ancho al formato largo, dividiendo las columnas que contienen “duration” y “results” en columnas separadas.
    2. Utilizar arrange() para ordenar los datos por id y número de prueba.
    3. Utilizar select() para eliminar la columna test_number.
    4. Utilizar separate() para dividir la columna duration en columnas separadas para la duración y el número de prueba.
    5. Utilizar select() para reorganizar las columnas en el orden deseado.

    El data frame resultante, df_long, debería estar en el formato deseado.

Comments are closed.