如何在前几列之后将数据框的列移动到行中?

sch*_*nee 14 r dataframe

我有一个数据框,每行代表一系列学校

edu <- read.table(header=TRUE, text="Elem Mid High
e1 m1 h1
e2 m2 h2
e1 m2 h2
e3 m1 h1")
Run Code Online (Sandbox Code Playgroud)

我想将其转换为边缘列表

  s1 s2
1 e1 m1
2 e2 m2
3 e1 m2
4 e3 m1
5 m1 h1
6 m2 h2
7 m2 h2
8 m1 h1
Run Code Online (Sandbox Code Playgroud)

对于有向图(通过igraph包).

我是这样做的:

e2m <- edu[,1:2]
m2h <- edu[,2:3]
colnames(e2m) <- c("s1", "s2")
colnames(m2h) <- c("s1", "s2")
schools <- rbind(e2m,m2e)
Run Code Online (Sandbox Code Playgroud)

"学校"包含我想要的东西,但如果我想添加第四列(例如"Uni"),它就是迭代的并且变得很麻烦.这样做的矢量化方法是什么?

Tyl*_*ker 11

这是一个可能的解决方案:

len <- seq_along(edu)
a <- head(len, -1)
b <- tail(len, -1)

data.frame(s1=as.character(unlist(edu[, a])), s2=as.character(unlist(edu[, b])))
Run Code Online (Sandbox Code Playgroud)


Mat*_*erg 6

直接将OP的代码翻译成申请.这不是矢量化的:

do.call(rbind, lapply(seq(ncol(edu)-1), FUN=function(x){
  r <- edu[,x:(x+1)]
  colnames(r) <- c('s1', 's2')
  r
}

))
Run Code Online (Sandbox Code Playgroud)