如何基于2列数据帧创建1s和0s的矩阵

时间:2016-03-09 02:49:27

标签: r

以下是我的数据的示例(我所拥有的实际是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)将是我开始的地方?

2 个答案:

答案 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的帖子。