【问题标题】:Changing row and column names on matrices to numbers将矩阵上的行名和列名更改为数字
【发布时间】:2012-05-04 17:04:23
【问题描述】:

我正在构建一个与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)) 并直接使用索引。

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

【问题讨论】:

  • 您描述了稀疏矩阵之类的东西。我认为它们应该出现在 R 中。

标签: r


【解决方案1】:

您可以将行名和列名用作以字符形式给出的索引。

首先创建具有排序索引的矩阵(根据您的示例,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)。 您没有指定行数或列数,所以我只使用了最大值。

【讨论】:

  • 我的问题是 bipartite 包(特别是 specieslevel 函数)需要一个矩阵,并且在传入 sparseMatrix 对象时不起作用。
  • 好吧,先制作matrix(),然后用x[cbind(s1,s2)] = weight更新非零元素
  • 我改变了我的答案,你应该把这个额外的信息放在问题中。
  • 我想我在帖子中并不清楚;我希望 s1 是列名, s2 是行名,而 weight 是元素。我在 OP 中添加了一个表格。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多