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)