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.

Pivotar múltiples conjuntos de columnas a la vez.

Tengo un marco de datos en el que he regresado una serie de conjuntos de datos, luego he tomado subconjuntos de esos conjuntos de datos y he vuelto a regresarlos. Esto ha resultado en un marco de datos con columnas que muestran la pendiente, la intersección y el error estándar del conjunto de datos “completo”, luego más columnas que muestran esas cosas para el conjunto de datos “subconjunto”.

Quiero transformar el conjunto de datos a un formato largo, donde una columna muestre qué tipo es (completo o subconjunto), luego otras columnas muestren la pendiente, el error estándar, la intersección, etc.

He descubierto una forma de hacer esto al usar “pivot_longer” muchas veces diferentes y luego filtrar donde las nuevas columnas creadas por el pivot coinciden, pero eso no puede ser la mejor forma de hacerlo. Me pregunto si hay alguna forma de enumerar conjuntos de columnas en la función pivot para omitir este gran fragmento de código. Un reprex a continuación.

# marco de datos creado
df <- 
  tribble(
    ~trial,   ~slope_completo,    ~se_completo,    ~slope_subconjunto,  ~se_subconjunto,
     1,            10,              1,                12,               2.5,
     2,             9,               1.2,             8.5,               3,
     3,             9.5,              2,               9.9,              3
  )

# pivot
df %>%
  # primero pivotear las columnas de pendiente
  pivot_longer(cols = c(slope_completo, slope_subconjunto),
               names_to = "tipo",
               values_to = "pendiente") %>%

  # luego pivotear las columnas de error estándar
  pivot_longer(cols = c(se_completo, se_subconjunto),
               names_to = "tipo_se",
               values_to = "error_estandar") %>%

  # agregar una columna para cuando coinciden (pendiente y error estándar del mismo conjunto de datos, completo o subconjunto)
  mutate(
    tipo_datos = 
      case_when(
        tipo == "slope_completo" & tipo_se == "se_completo" ~ "completo",
        tipo == "slope_subconjunto" & tipo_se == "se_subconjunto" ~ "subconjunto"
      )
    ) %>%

  # eliminar filas que no coinciden
  filter(!is.na(tipo_datos)) %>%

  # eliminar columnas adicionales generadas por el pivot
  select(-tipo, -tipo_se) %>%
  relocate(tipo_datos, .after = trial)

Esto me da la salida deseada, solo siento que no puedo ser la forma en que se supone que debo hacer esto. ¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes simplificar este código utilizando la función pivot_longer() con un vector de nombres de columna para separarlos en diferentes columnas según su prefijo. También puedes usar pivot_wider() para reorganizar los datos y juntar los valores de pendiente y error estándar para cada conjunto de datos. Aquí tienes un ejemplo de código que logra esto:

    library(dplyr)
    library(tidyr)
    
    # dataframe creado
    df <- 
      tribble(
        ~trial,   ~full_slope,    ~full_slope_se,    ~subset_slope,  ~subset_slope_se,
         1,            10,              1,                12,               2.5,
         2,             9,               1.2,             8.5,               3,
         3,             9.5,              2,               9.9,              3
      )
    
    # separar los valores de pendiente y error estándar en columnas diferentes
    df_long <- df %>%
      pivot_longer(cols = starts_with(c("full_", "subset_")),
                   names_to = c(".value", "group"),
                   names_sep="_")
    
    # juntar los valores de pendiente y error estándar para cada conjunto de datos
    df_long %>%
      pivot_wider(names_from = group, values_from = c(slope, se)) %>%
      mutate(data_type = ifelse(is.na(subset_slope), "full", "subset")) %>%
      select(trial, data_type, full_slope, full_slope_se, subset_slope, subset_slope_se) 
    

    Este código primero utiliza pivot_longer() para separar los valores de pendiente y error estándar en columnas diferentes según su prefijo (full_ o subset_). El dataframe resultante tiene cuatro columnas: trial, slope, se, y group (que identifica el prefijo original, ya sea full_ o subset_).

    Luego, se utiliza pivot_wider() para reunir los valores de pendiente y error estándar para cada conjunto de datos en la misma fila. Esto da como resultado un dataframe con seis columnas: trial, full_slope, full_slope_se, subset_slope, subset_slope_se, y data_type (que identifica si la fila es para el conjunto de datos full o subset).

    Finalmente, el código utiliza select() para reordenar las columnas y obtener el resultado deseado.

Comments are closed.