在R中使用矩阵。将元素放置在矩阵中

时间:2018-11-23 21:30:25

标签: r

我有一个距离矩阵。例如:

d<-matrix(c(0,2,3,7,11,0,13,6,8,5,0,12,6,53,12,0), nrow = 4, ncol = 4)
d
     [,1] [,2] [,3] [,4]
[1,]    0   11    8    6
[2,]    2    0    5   53
[3,]    3   13    0   12
[4,]    7    6   12    0

我想创建一个距离小于或等于5的邻居矩阵。在矩阵nb中,1表示不是邻居。但是,他们没有邻居(例如,第1行和第4行本身除外)。我希望距离最短的邻居为他们的邻居。

> nb=(d>=5)
> nb*1
     [,1] [,2] [,3] [,4]
[1,]    0    1    1    1
[2,]    0    0    1    1
[3,]    0    1    0    1
[4,]    1    1    1    0

预期结果

          [,1] [,2] [,3] [,4]
    [1,]    0    1    1    0
    [2,]    0    0    1    1
    [3,]    0    1    0    1
    [4,]    1    0    1    0

我已经尝试过了,我不知道如何不使用循环就有效地获取它。这只是一个例子,我的实际数据有9000多行。任何建议都会有所帮助。非常感谢!

1 个答案:

答案 0 :(得分:0)

我相信以下功能可以满足您的需求。

fun <- function(Dist, n = 5){
  nb <- (Dist > n)*1L
  for(i in seq_len(nrow(nb))) {
    tmp <- Dist[i, ]
    tmp[tmp == 0] <- Inf
    nb[i, which.min(tmp)] <- 0L
  }
  nb
}

fun(d)
#     [,1] [,2] [,3] [,4]
#[1,]    0    1    1    0
#[2,]    0    0    0    1
#[3,]    0    1    0    1
#[4,]    1    0    1    0

fun(d, 10)
#     [,1] [,2] [,3] [,4]
#[1,]    0    1    0    0
#[2,]    0    0    0    1
#[3,]    0    1    0    1
#[4,]    0    0    1    0