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!
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 usarpivot_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: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_
osubset_
). El dataframe resultante tiene cuatro columnas:trial
,slope
,se
, ygroup
(que identifica el prefijo original, ya seafull_
osubset_
).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
, ydata_type
(que identifica si la fila es para el conjunto de datosfull
osubset
).Finalmente, el código utiliza
select()
para reordenar las columnas y obtener el resultado deseado.