以下是我的数据的示例(我所拥有的实际是1300行,或两个不同节点之间的1300个连接/边缘):
node# node#
1 3
1 4
2 4
2 5
3 4
3 5
我目前在数据框中有上述数据。这代表一个网络,汽车可以从节点1驱动到3或1到4,从节点2到4或节点2到5等。我想创建一个如下所示的矩阵:
> [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 0 0 0 0 0
[2,] 0 0 0 0 0 0
[3,] 0 0 0 0 0 0
[4,] 0 0 0 0 0 0
[5,] 0 0 0 0 0 0
我陷入困境:我想在离开节点的矩阵中输入1,在同一列中输入目标节点矩阵中的-1。因此,对于这个6节点连接数据帧,矩阵看起来像:
> [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 0 0 0 0
[2,] 0 0 1 1 0 0
[3,] -1 0 0 0 1 1
[4,] 0 -1 -1 0 -1 0
[5,] 0 0 0 -1 0 -1
但就像我说的那样,我有超过1300个连接,所以手动这样做需要一段时间。所以我猜测矩阵(0,5,1300)将是我开始的地方?
答案 0 :(得分:6)
您可以使用2列索引矩阵索引矩阵的特定行/列对。这提供了一种方便的方法来设置所有1,然后设置所有-1:
mat <- matrix(0, nrow=max(dat), ncol=nrow(dat))
mat[cbind(dat$node1, seq_len(nrow(dat)))] <- 1
mat[cbind(dat$node2, seq_len(nrow(dat)))] <- -1
mat
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 1 0 0 0 0
# [2,] 0 0 1 1 0 0
# [3,] -1 0 0 0 1 1
# [4,] 0 -1 -1 0 -1 0
# [5,] 0 0 0 -1 0 -1
(感谢@PierreLafortune关于在数据框上调用max
的技巧!)
数据:
dat <- data.frame(node1=c(1, 1, 2, 2, 3, 3), node2=c(3, 4, 4, 5, 4, 5))
答案 1 :(得分:3)
我们也可以使用sparseMatrix
library(Matrix)
library(Matrix)
B <- sparseMatrix(dat$node2, seq_len(nrow(dat)), x= -1)
mat <- sparseMatrix(dat$node1, seq_len(nrow(dat)), x= 1,
dims=dim(B)) + B
as.matrix(mat)
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 1 1 0 0 0 0
#[2,] 0 0 1 1 0 0
#[3,] -1 0 0 0 1 1
#[4,] 0 -1 -1 0 -1 0
#[5,] 0 0 0 -1 0 -1
注意:dat
取自@ josliber的帖子。