Combina marcos de datos de formato largo con diferentes longitudes y conviértelos en formato ancho.
Quiero combinar marcos de datos en formato largo con diferente longitud debido a la variable ‘tiempo’ (panel de datos desequilibrado):
set.seed(63)
#función para crear un marco de datos que incluya id, tiempo y x
func1 <- function (size=5) {
x=sample(c(0,1), 1)
data.frame(tiempo=1:size, x=x)}
#función para combinar marcos de datos por fila
func2 <- do.call("rbind", Map(function(x,y) {
data.frame(id=x, func1(y))
}, 1:5, 5))
#Muestrear 10 observaciones para crear un panel de datos desequilibrado
dd <- func2[sample(nrow(func2), 10), ]
fd <- dd[with(dd, order(id, tiempo)),]
> fd
id tiempo x
1 1 1 0
2 1 2 0
3 1 3 0
4 1 4 0
5 1 5 0
10 2 5 1
13 3 3 0
17 4 2 0
18 4 3 0
21 5 1 0
Finalmente, quiero convertirlo al formato ancho y llenar con NA las celdas omitidas de ‘x’ según la variable ‘tiempo’. Algo como esto:
id x.tiempo1 x.tiempo2 x.tiempo3 x.tiempo4 x.tiempo5
1 0 0 0 0 0
2 NA NA NA NA 1
3 NA NA 0 NA NA
4 NA 0 0 NA NA
5 0 NA NA NA NA
davy.ai
Para combinar los marcos de datos en formato largo y rellenar los valores faltantes con NAs, podemos usar los paquetes
tidyr
ydplyr
. Aquí hay una posible solución:“`{r}
library(tidyr)
library(dplyr)
Convertir los datos a formato largo
fd_long <- fd %>%
pivot_longer(cols = c(“time”, “x”), names_to = “variable”, values_to = “value”) %>%
arrange(id, variable)
Rellenar los valores faltantes con NAs
fd_wide <- fd_long %>%
group_by(id) %>%
complete(variable = paste0(“time”, 1:max(fd$time)), fill = list(value = NA)) %>%
pivot_wider(names_from = variable, values_from = value)
Ver el resultado
fd_wide
“`
Este código primero convierte los datos a formato largo usando
pivot_longer()
. Especificamos que las variablestime
yx
deben combinarse en una sola columna llamadavalue
, y que los nombres de las variables originales deben almacenarse en una nueva columna llamadavariable
. Luego ordenamos los datos porid
yvariable
.A continuación, rellenamos los valores faltantes con
complete()
, que genera filas para todas las combinaciones deid
yvariable
en los datos, rellenando los valores faltantes con NAs. Especificamos el rango de valores devariable
que se van a completar en función del valor máximo detime
en el marco de datos original. El argumentofill
indica a la función que debe rellenar los valores faltantes con NAs.Por último, convertimos los datos de nuevo a formato ancho usando
pivot_wider()
, especificando que la columnavariable
debe dividirse en columnas separadas en función de sus valores (es decir, los valores detime
). El argumentovalues_from
especifica que la columnavalue
debe usarse para completar las celdas de los datos en formato ancho.El marco de datos resultante debe tener una fila para cada valor único de
id
, con columnas separadas para cada valor detime
(hasta el máximo detime
en los datos), y NAs para cualquier celda con valores faltantes.