Преобразовать фрейм данных из 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)