Работа с матрицей в R. Поместить элемент в матрицу - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть матрица расстояний.Например:

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 голосов
/ 24 ноября 2018

Я считаю, что следующая функция делает то, что вы хотите.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...