首页 > 解决方案 > 如何使用来自另一个矩阵的非 NA 值以及它们所在的行和列创建一个新矩阵?

问题描述

我有一个名为d的n x n矩阵,其中大部分填充了 NA 值,但有一些随机值分布在各处。

我需要创建一个名为ds的新矩阵,其中包含名为headtailweight的三列,其中weight是在矩阵d中找到的值,而headtail分别是d的行和列,其中找到了weight的特定值.

矩阵d

n = 1000 
d = runif(n*n) 
d[d < 0.80] = NA 
d = matrix(d,nrow=n,ncol=n) #reshape the vector 
diag(d) = NA # no self-loops 
d[upper.tri(d)] = t(d)[upper.tri(d)] # undirected graphs are symmetric

str(d)
num [1:1000, 1:1000] NA NA NA 0.861 NA ...

str(ds)和的期望输出head(ds)

str(ds) 
num [1:99858, 1:3] 1 1 1 1 1 1 1 1 1 1 ... 
- attr(*, "dimnames")=List of 2 
..$ : NULL 
..$ : chr [1:3] "head" "tail" "weight" 

head(ds) 
     head tail    weight 
[1,]    1   15 0.9205357 
[2,]    1   16 0.9938016 
[3,]    1   29 0.9480700

上面矩阵中返回的实际值并不重要,因为它们是随机生成的,但我的最终输出应该看起来相似。

我试过的:

head = c()
tail = c()
weight = c()
for (i in 1:n)
  for (j in 1:n)
    if (is.na(d[i][j]) == FALSE)
      head[i] = i
      tail[i] = j
      weight[i] = d[i][j]
ds = cbind(head, tail, weight)

但是,这会导致以下结果:

str(ds)
 num [1:1000, 1:3] NA NA 3 NA NA NA NA NA NA NA ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:3] "head" "tail" "weight"

head(ds)
     head tail weight
[1,]   NA   NA     NA
[2,]   NA   NA     NA
[3,]    3   NA     NA
[4,]   NA   NA     NA
[5,]   NA   NA     NA
[6,]   NA   NA     NA

再次,我如何在矩阵d中搜索非 NA 值,当找到它们时,将矩阵ds更新为它所在的行、它所在的列以及值本身?

标签: rfor-loopmatrixgraphadjacency-matrix

解决方案


我们可以用两个很好的 R 技巧来处理矩阵:which(arr.ind = TRUE)和在[. 下面我只修改了您的设置代码以添加可重复性种子并制作n10 个,这样您就可以看到所有元素并说服自己这是在做它应该做的事情。

首先,我们使用which返回矩阵中非 NA 行和列索引的矩阵d。使用arr.ind = TRUE,我们为输入的每个维度保留一个索引,而不是在索引之前展平为向量。其次,我们将索引与通过将该索引矩阵传递给 获得的相应权重的向量进行列绑定[。您可以直观地比较dout看到值对齐。

set.seed(1)
n = 10 
d = runif(n*n) 
d[d < 0.80] = NA 
d = matrix(d,nrow=n,ncol=n) #reshape the vector 
diag(d) = NA # no self-loops 
d[upper.tri(d)] = t(d)[upper.tri(d)]

indices <- which(!is.na(d), arr.ind = TRUE)
out <- cbind(indices, d[indices])
colnames(out) <- c("head", "tail", "weight")
head(out)
#>      head tail    weight
#> [1,]    4    1 0.9082078
#> [2,]    6    1 0.8983897
#> [3,]    7    1 0.9446753
#> [4,]    8    2 0.9919061
#> [5,]    9    3 0.8696908
#> [6,]    1    4 0.9082078

reprex 包(v0.3.0)于 2019 年 9 月 24 日创建


推荐阅读