1

我正在构建一个与bipartite包一起使用的邻接矩阵。每一行和每一列代表两个不同类的实体,并代表第一类m[i,j]实体和第二类实体之间的交互。我目前有一个表格的数据框ijdf

     s1   s2 weight
1   261  446      1
2   188  259      4
3   144 1119      1

其中,例如,第 2 行表示权重为 4 的成员 188s1和 259之间的交互。s2所以m[259,188]应该是 4。但是,由于不是 1 和 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)并以这种方式对其进行索引会效率低下/笨拙。我还考虑保留 and 的唯一元素的向量s1s2使用 eg m[which(unique.s2 == i), which(unique.s1 == j)],但同样,这似乎是一个次优的解决方案。由于并非 min(s1) 和 max(s1) 之间的每个数字都在矩阵中,因此我不能只制作维度 c(max(s1), max(s2)) 并直接使用索引。

有没有更好的方法来实现我的目标?

4

1 回答 1

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). 您没有指定行数或列数,所以我只使用了最大值。

于 2012-05-04T08:04:22.077 回答