【问题标题】:Turning a sparse adjacency list into a full matrix in R将稀疏邻接列表转换为 R 中的完整矩阵
【发布时间】:2021-07-02 05:16:58
【问题描述】:

我在本网站的研究中看到了与此类似的问题,但不是这个确切的问题(大多数答案涉及从列表中创建稀疏矩阵)。

我有一个相邻多边形的列表,但希望将其转换为完整矩阵。我可以用嵌套的 for 循环相当笨拙地做到这一点,但我试图通过减少对这些循环的依赖来改进我的编码。所以本质上,我想从中得到:

my_list <- list("1" = c(2, 3),
                "2" = 1,
                "3" = 1)

看起来像这样的东西:

#     [,1] [,2] [,3]
#[1,]    0    1    1
#[2,]    1    0    0
#[3,]    1    0    0

不诉诸于此:

for(i in 1:3{
 for(j in 1:3{
  [look to list to see if there is a value corresponding to (i, j),
   if so insert 1, if not, zero]
 }
}

非常感谢您的宝贵时间。

【问题讨论】:

  • 和 sprse 矩阵方法 ..Matrix::sparseMatrix(i=unlist(my_list), j=rep(seq(my_list), lengths(my_list)), x=1)

标签: r list matrix apply sparse-matrix


【解决方案1】:

你可以试试sapplytabulate

nbins <- max(unlist(my_list)) # 3
sapply(my_list, function(x) tabulate(x, nbins = nbins))
#     [,1] [,2] [,3]
#[1,]    0    1    1
#[2,]    1    0    0
#[3,]    1    0    0

可以在没有匿名函数的情况下编写,并带有安全检查

vapply(my_list, tabulate, nbins = nbins, FUN.VALUE = integer(nbins))

【讨论】:

    【解决方案2】:

    你可以使用sapply

    n <- 1:max(unlist(my_list))
    sapply(my_list, function(x) +(n %in% x))
    
    #     [,1] [,2] [,3]
    #[1,]    0    1    1
    #[2,]    1    0    0
    #[3,]    1    0    0
    

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 2015-07-24
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2021-11-25
      • 2017-07-02
      相关资源
      最近更新 更多