簡體   English   中英

如何基於2列數據幀創建1s和0s的矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM