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.

¿Cómo puedes convertir un dataframe con un número desigual de columnas a un formato largo y ordenado?

Tengo una hoja de cálculo de Excel grande en la que las filas tienen un número desigual de columnas. El nombre de las columnas se repite y estas columnas almacenan datos en varios formatos (numérico, caracter, fecha, etc). ¿Cómo puedo cambiar la forma de estos datos a un formato largo y ordenado?

Aquí se muestra cómo se ve mi dataframe

df <- tibble(id = c("T1", "T2", "T3"), x = c(4:6), y = c("A", "B", "C"), x = c(7, 8, NA), y = c("A", "B", NA), x = c(NA, 4, NA), y= c(NA, "F", NA), .name_repair = "minimal")
df

Me gustaría obtener este tipo de salida

ID X Y
T1 4 A
T1 7 A
T2 5 B
T2 6 B
T2 4 F
T3 6 C

¡Muchas gracias por tu ayuda!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para darle formato largo y ordenado a estos datos, puedes utilizar la función pivot_longer() de tidyr. Sin embargo, antes de pivotar, debes asegurarte de que los nombres de las columnas sean únicos y luego apilar las columnas una encima de la otra. Aquí tienes un proceso paso a paso para obtener el resultado deseado:

    1. Renombra las columnas para que sean únicas:

    “`{r}
    names(df) <- c(“id”, “x1”, “y1”, “x2”, “y2”, “x3”, “y3”)


    2. Apila las columnas una encima de la otra utilizando `tidyr::gather()`: ```{r} df_long <- tidyr::gather(df, key = "variable", value = "value", -id)
    1. Extrae el sufijo numérico de la columna variable utilizando expresiones regulares:

    “`{r}
    df_long <- dplyr::mutate(df_long, suffix = stringr::str_extract(variable, “\d+”))


    4. Elimina las filas con valores faltantes: ```{r} df_long <- df_long[complete.cases(df_long), ]
    1. Pivote los datos al formato deseado utilizando tidyr::pivot_wider():

    {r}
    df_tidy <- tidyr::pivot_wider(df_long, names_from = "variable", values_from = "value")

    El dataframe resultante df_tidy debería tener el resultado deseado.

Comments are closed.