Convierta el marco de datos de N columnas en un marco de datos de dos columnas 'apiladas'

Hola comunidad de pila.

Estoy trabajando con análisis de red y tengo una pregunta de remodelación de datos.

Mis datos originales vienen como una serie de columnas, cada columna es un par "fuente" y "objetivo". El marco de datos final debe estar compuesto por dos columnas "fuente" y "destino". Tenga en cuenta que estos pares están escalonados a medida que se originan y los objetivos están vinculados como en una red dirigida. (Consulte la salida final en el ejemplo de código para la salida deseada)

Creé un método muy hacky que produce el resultado que necesito (vea el código a continuación) pero no se adapta a diferentes números de columnas sin que yo agregue variables y otras cosas. Además, tenga en cuenta que, en algunos casos, el número de pares de columnas será un número impar, es decir, una "fuente" sin "destino" al final del marco de datos. En este caso, la columna "objetivo" que falta se crea con NA.

Siento que hay una manera suave de producir esto sin todo el trabajo manual. He estado buscando y buscando y no he encontrado nada. Muchas gracias por tu ayuda.

Tim

# Create example DF
mydf <- data.frame(id = 1:6, varA = "A",
               varB = "B",
               varC = "C",
               varD = "D",
               varE = "E",
               varF = "F")
#Remove the ID value for DF build. This variable is not in real DF
mydf$id <-NULL

#Begin inelegant hack. 
#Please note: the incoming DF has an indeterminate number of columns that vary with project

counter <-ncol(mydf)
   for (i in 1:counter){
   t1 <-mydf[(counter-counter+1):(counter-counter+2)] 
   t2 <-mydf[(counter-counter+2):(counter-counter+3)]
   t3 <-mydf[(counter-counter+3):(counter-counter+4)]
   t4 <-mydf[(counter-counter+4):(counter-counter+5)]
   t5 <-mydf[(counter-counter+5):(counter-counter+6)]
    }

#Rename for the rbind
names(t1) <-c("Source", "Target")
names(t2) <-c("Source", "Target")
names(t3) <-c("Source", "Target")
names(t4) <-c("Source", "Target")
names(t5) <-c("Source", "Target")

#This is the shape I need but the process is super manual and does not accommodate differing numbers of columns.
final_output <-rbind(t1,t2,t3,t4,t5)

Respuestas a la pregunta(1)

Su respuesta a la pregunta