我有一个数据框,每行代表一系列学校
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)
直接将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)
| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |