将矩阵上的行名和列名更改为数字

时间:2012-05-04 06:39:51

标签: r

我正在构建一个与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)并将其编入索引是低效/笨拙的。我还考虑保留s1s2的唯一元素的向量,并使用例如m[which(unique.s2 == i), which(unique.s1 == j)],但同样,这似乎是一个次优的解决方案。由于不是min(s1)和max(s1)之间的每个数字都在矩阵中,我不能只使尺寸为c(max(s1),max(s2))并直接使用索引。

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

1 个答案:

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