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 puedo combinar varias columnas en una variable, adjuntando cada una al final de la otra y agrupando por los valores de una variable de ID?

Tengo un dataframe con múltiples columnas relacionadas con la misma variable, que me gustaría combinar en una sola columna. Sin embargo, la mayoría de las respuestas que encuentro aquí sobre este tema se refieren a la concatenación de columnas (por ejemplo, https://stackoverflow.com/questions/27906021/merge-2-columns-into-one-in-dataframe), mientras que yo quiero preservar cada celda individual de datos en mi dataframe, pero simplemente juntarlas en una sola columna.

Para mayor claridad, aquí hay una muestra de cómo se ve aproximadamente mi entrada de datos.

a b c ID
string1 string11 string21 1111
string2 string12 string22 2222

Así es como me gustaría que se vean estos datos:

newvar ID
string1 1111
string11 1111
string21 1111
string2 2222
string12 2222
string22 2222

Hasta ahora, he estado intentando usar “pivot_longer()” para lograr esto, de la siguiente manera:

pivot_longer(df, c("a", "b", "c"), "newvar")

Pero creo que debo malinterpretar el propósito de pivot_longer() porque el df que devuelve tiene celdas pobladas con los valores “a”, “b” y “c” en lugar de los valores de fila de esas columnas. También no estoy seguro de que pivot_longer tenga la capacidad de agrupar por columna de ID como deseo, excepto tal vez a través de piping. Cualquier ayuda es muy apreciada.

Edit: Me he dado cuenta de que mi problema al usar pivot_longer() parece ser que necesito especificar “values_to” como el argumento que responde a “newvar”.

pivot_longer(df, c("a", "b", "c"), values_to = "newvar")

Este código logra en su mayoría lo que necesito.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para combinar varias columnas en una sola columna mientras se preservan los valores individuales de las celdas en un dataframe, puedes usar la función pivot_longer() del paquete tidyr. Aquí está la sintaxis general:

    tidyr::pivot_longer(data = tus_datos, 
                        cols = c(columna1, columna2, columna3), 
                        names_to = "nueva_variable", 
                        values_to = "valor")
    

    Esta función creará una nueva columna llamada “nueva_variable” y una nueva columna llamada “valor”, que contendrán los nombres de las columnas y los valores, respectivamente. El argumento cols especifica qué columnas quieres combinar, y el argumento names_to especifica el nombre de la nueva columna que contendrá los nombres originales de las columnas.

    Para agrupar los datos por la columna “ID”, puedes usar la función group_by() del paquete dplyr antes de usar pivot_longer():

    library(dplyr)
    library(tidyr)
    
    tus_datos %>%
      group_by(ID) %>%
      pivot_longer(cols = c(a, b, c),
                   names_to = "nueva_variable",
                   values_to = "valor")
    

    Esto te dará la salida deseada como se muestra en la pregunta. Puedes asignar la salida a una nueva variable o sobrescribir el dataframe original para guardar los cambios.

Comments are closed.