Преобразовать фрейм данных из N столбцов в фрейм данных из двух «сложенных» столбцов

Сообщество Hello Stack.

Я занимаюсь сетевой аналитикой и у меня вопрос по изменению данных.

Мои исходные данные представлены в виде ряда столбцов, каждый из которых представляет собой пару «источник» и «цель». Конечный кадр данных должен состоять из двух столбцов «источник» и «цель». Обратите внимание, что эти пары расположены в шахматном порядке, так как они связаны с источником и целями, как в целевой сети. (См. Final_output в примере кода для желаемого вывода)

Я создал очень хакерский метод получения нужного мне результата (см. Код ниже), но он не учитывает разное количество столбцов без добавления переменных и прочего. Кроме того, обратите внимание, что в некоторых случаях количество пар столбцов будет нечетным числом, то есть один «источник» без «цели» в конце фрейма данных. В этом случае отсутствующий «целевой» столбец создается с NA.

Я чувствую, что есть плавный способ сделать это без всякой ручной работы. Я искал и искал и ничего не встречал. Спасибо большое за вашу помощь.

Тим

# 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)

Ответы на вопрос(1)

Ваш ответ на вопрос