Reforma especial en R
Considere un dataframe de 3×3 de tipo char
:
“`{r}
example <- data.frame(one = c("a","b","c"),
two = c("a","b","b"),
three = c ("c","a","b"))
<pre><code><br />Quiero redimensionar estos datos a 6×2 y añadir el siguiente contenido:
“`{r}
desired <- data.frame(one = c(“a”,”a”,”b”,”b”,
“c”,”b”),
two = c(“a”,”c”,”b”,”a”,”b”,”b”))
Para el dataframe de ejemplo original, quiero unir por filas (rbind()
) el contenido de example[,2:3] debajo de cada índice de fila.
Esto se puede lograr mediante:
ex <- as.matrix(example)
des <- as.data.frame(rbind(ex[,1:2], ex[,2:3]))
¿Tal vez sería más conveniente usar library(tidyverse)
para un número arbitrario de columnas?
davy.ai
Sí, utilizar
tidyverse
puede hacer esta tarea más fácil y flexible para un número arbitrario de columnas. Un enfoque consiste en utilizarpivot_longer()
para convertir los datos a un formato largo, luegoarrange()
para ordenar las filas en función del índice de fila original, y finalmentepivot_wider()
para remodelar los datos al formato deseado. Aquí está el código:“`{r}
library(tidyverse)
example %>%
pivot_longer(everything()) %>%
arrange(row_number()) %>%
mutate(col = rep(c(1, 2), each = nrow(example))) %>%
pivot_wider(names_from = col, values_from = value) %>%
select(-name)
“`
Esto produce la misma salida que el dataframe
desired
:“`{r}
A tibble: 6 x 2
one two
1 a a
2 a c
3 b b
4 b a
5 c b
6 b b
“`