将N列的数据帧转换为两个堆叠的数据帧。列

时间:2015-03-23 15:14:55

标签: r dataframe reshape rbind

Hello Stack社区。

我正在使用网络分析,并有一个数据重塑问题。

我的原始数据以一系列列的形式出现,每列都是“源”和“目标”对。最终的数据框架需要由两列“源”和“目标”组成。请注意,这些对是交错的,因为它们的源和目标是在有向网络中链接的。 (请参阅代码示例中的final_output以获取所需的输出)

我创建了一个非常hacky的方法,产生了我需要的输出(参见下面的代码),但是如果不添加变量和诸如此类的东西,它就不能容纳不同数量的列。此外,请注意在某些情况下,列对的数量将是奇数,即在数据帧的末尾没有“目标”的一个“源”。在这种情况下,缺少的“目标”列是使用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 个答案:

答案 0 :(得分:3)

如果我理解正确,您可以使用unlist并手动创建data.frame

mydf[] <- lapply(mydf, as.character)  # Convert factors to characters
final_output <- data.frame(Source = unlist(mydf[-length(mydf)]), 
                           Target = unlist(mydf[-1]))
head(final_output, 15)
#       Source Target
# varA1      A      B
# varA2      A      B
# varA3      A      B
# varA4      A      B
# varA5      A      B
# varA6      A      B
# varB1      B      C
# varB2      B      C
# varB3      B      C
# varB4      B      C
# varB5      B      C
# varB6      B      C
# varC1      C      D
# varC2      C      D
# varC3      C      D