Converter quadro de dados de N colunas em um quadro de dados de duas colunas 'empilhadas'

Olá Comunidade Stack.

Estou trabalhando com análises de rede e tenho uma pergunta de reformulação de dados.

Meus dados originais aparecem como uma série de colunas, cada coluna sendo um par "origem" e "destino". O quadro de dados final precisa ser composto de duas colunas "origem" e "destino". Observe que esses pares são escalonados à medida que a origem e os destinos são vinculados como em uma rede direcionada. (Veja a final_output no exemplo de código para obter a saída desejada)

Criei um método muito hacky para produzir a saída de que preciso (veja o código abaixo), mas ele não acomoda números diferentes de colunas sem que eu adicione variáveis e outros enfeites. Além disso, observe que, em alguns casos, o número de pares de colunas será um número ímpar, ou seja, uma "origem" sem "destino" no final do quadro de dados. Nesse caso, a coluna "destino" ausente é criada com os NAs.

Eu sinto que há uma maneira suave de produzir isso sem todo o trabalho manual. Estive pesquisando e pesquisando e não encontrei nada. Muito obrigado pela sua ajuda.

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)