r - 如何使用来自另一个矩阵的非 NA 值以及它们所在的行和列创建一个新矩阵?
问题描述
我有一个名为d的n x n矩阵,其中大部分填充了 NA 值,但有一些随机值分布在各处。
我需要创建一个名为ds的新矩阵,其中包含名为head、tail和weight的三列,其中weight是在矩阵d中找到的值,而head和tail分别是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更新为它所在的行、它所在的列以及值本身?
解决方案
我们可以用两个很好的 R 技巧来处理矩阵:which(arr.ind = TRUE)
和在[
. 下面我只修改了您的设置代码以添加可重复性种子并制作n
10 个,这样您就可以看到所有元素并说服自己这是在做它应该做的事情。
首先,我们使用which
返回矩阵中非 NA 行和列索引的矩阵d
。使用arr.ind = TRUE
,我们为输入的每个维度保留一个索引,而不是在索引之前展平为向量。其次,我们将索引与通过将该索引矩阵传递给 获得的相应权重的向量进行列绑定[
。您可以直观地比较d
并out
看到值对齐。
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 日创建
推荐阅读
- apache - How to set Caddy as a reverse proxy for apache
- javascript - 将nodejs中的字符串解析为数组
- python - Numpy 的分区函数是如何工作的?
- python - 带有seaborn的多个箱线图,但不在同一框架内
- android - 当我在适配器中调用编辑项目时,为什么我的 recyclerview 项目克隆?
- angular - RxJS 多主题订阅少 vs 单主题多订阅
- webgl - webgl 的变化没有按预期工作
- .htaccess - 单个页面的手动重写规则,然后是其他页面的包罗万象
- javascript - 如何在 1 个 API 调用中多次访问数组中单个元素的密钥对值?
- javascript - 在 NodeJS 中公开函数的更好方法?