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.

Cómo expandir un dataframe basado en dos columnas?

No estoy seguro de cómo resolver esto. Tengo un dataframe que se ve así:

df <- structure(list(category = c(1, 2, 3, 4, 5), f1 = c(2, 3, 2, 3, 1), 
           f2 = c(1, 2, 4, 1, 2)), row.names = c(NA, -5L),
           class = c("tbl_df", "tbl", "data.frame"))

Los números en las variables (excepto la variable llamada “category”) representan sujetos que pertenecen a una de esas categorías y f1 y f2 son una variable dividida en estas dos variables. Me gustaría “apilar” (melt) estas variables y esos 2 en la variable f1, por ejemplo, se convertirían en 2 filas dentro de una variable llamada “f” y tendrán el número 1, manteniendo la categoría junto a ellos, que en este caso es 1. F2, categoría 1, tiene 1 observación y se convertiría en 1 fila dentro otra vez de la variable “f” y la categoría 1, pero esta vez tendrá el número 2.

Entonces, f1 siempre producirá filas que tendrán 1 en la columna “f” y f2 producirá filas que siempre tendrán “2” en la columna “f”.

A continuación se muestra un ejemplo visual de lo que estoy tratando de lograr:

  category f
1        1 1
2        1 1
3        1 2
4        2 1
5        2 1
6        2 1
7        2 2
8        2 2
9        3 1
10       3 1
11       3 2
12       3 2
13       3 2
14       3 2

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes utilizar la función tidyr::gather() para convertir las variables “f1” y “f2” en un formato largo, y luego crear una nueva columna “f” basada en los nombres de las variables. Finalmente, puedes utilizar dplyr::arrange() para ordenar el data frame resultante por “category” y “f”. Aquí está el código:

    library(tidyr)
    library(dplyr)
    
    df_long <- df %>% 
      gather(key = "key", value = "value", -category) %>% 
      mutate(f = ifelse(key == "f1", 1, 2)) %>% 
      select(category, f, value) %>% 
      arrange(category, f)
    
    df_long
    

    Esto te dará la siguiente salida:

    # A tibble: 14 x 3
       category     f value
          <dbl> <dbl> <dbl>
     1        1     1     2
     2        1     1     3
     3        1     2     1
     4        2     1     3
     5        2     1     2
     6        2     1     1
     7        2     2     4
     8        2     2     1
     9        3     1     2
    10        3     1     2
    11        3     2     4
    12        3     2     1
    13        3     2     2
    14        3     2     3
    

    Como puedes ver, el data frame derretido tiene el formato deseado con una columna “category” y una columna “f” para los valores de “f1” y “f2”, respectivamente.

Comments are closed.