[英]How to create a matrix with 1s and 0s based off a 2-column data frame
以下是我的數據的示例(我擁有的實際是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列索引矩陣索引矩陣的特定行/列對。 這提供了一種方便的方法來設置所有的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))
我們也可以使用library(Matrix)
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的帖子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.