我正在构建一个与bipartite
包一起使用的邻接矩阵。每个行和列表示两个不同类的实体,m[i,j]
表示第一个类的实体i
与第二个类的j
之间的交互。我目前有一个
df
s1 s2 weight
1 261 446 1
2 188 259 4
3 144 1119 1
其中,例如,第2行表示s1
的成员188与权重4的s2
的259之间的交互。因此m[259,188]
应为4.但是,因为不是每个值将表示1和max(df$s1, df$s2)
之间,使用正常索引将不起作用。如果有可能,我想要这样的事情:
[,144] [,188] [,261]
[259,] 0 4 0
[446,] 0 0 1
[1119,] 1 0 0
我知道我可以将列和行重命名为字符向量,但我认为将它设置为as.character(unique(df$s1))
(类似于s2
)并将其编入索引是低效/笨拙的。我还考虑保留s1
和s2
的唯一元素的向量,并使用例如m[which(unique.s2 == i), which(unique.s1 == j)]
,但同样,这似乎是一个次优的解决方案。由于不是min(s1)和max(s1)之间的每个数字都在矩阵中,我不能只使尺寸为c(max(s1),max(s2))并直接使用索引。
有没有更好的方法来实现我的目标?
答案 0 :(得分:2)
您可以使用行名和列名作为字符给出的索引。
首先使用已排序的索引创建矩阵(根据您的示例,s2是行)。
s1 <- c(261, 188, 144); s2 <- c(446, 259, 1119)
m <- matrix(0, length(s2), length(s1), dimnames = list(as.character(sort(s2)), as.character(sort(s1))))
weight <- c(1, 4, 1)
m[cbind(as.character(s2), as.character(s1))] <- weight
144 188 261
259 0 4 0
446 0 0 1
1119 1 0 0
m <- matrix(0, 261, 1119)
x[cbind(s1,s2)] <- weight
如果您希望NA
而不是零作为默认值,请将其替换为as.numeric(NA)
。
您没有指定行数或列数,因此我只使用了最大值。