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.

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
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para combinar los marcos de datos en formato largo y rellenar los valores faltantes con NAs, podemos usar los paquetes tidyr y dplyr. 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 variables time y x deben combinarse en una sola columna llamada value, y que los nombres de las variables originales deben almacenarse en una nueva columna llamada variable. Luego ordenamos los datos por id y variable.

    A continuación, rellenamos los valores faltantes con complete(), que genera filas para todas las combinaciones de id y variable en los datos, rellenando los valores faltantes con NAs. Especificamos el rango de valores de variable que se van a completar en función del valor máximo de time en el marco de datos original. El argumento fill 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 columna variable debe dividirse en columnas separadas en función de sus valores (es decir, los valores de time). El argumento values_from especifica que la columna value 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 de time (hasta el máximo de time en los datos), y NAs para cualquier celda con valores faltantes.

Comments are closed.