Создайте двоичную матрицу смежности из вектора индексов

Предположим, у меня есть вектор, который выглядит так:

x <- sample(5, 500, replace = TRUE)

так что каждый элемент соответствует некоторому индексу от 1 до 5.

Какой эффективный способ создать двоичную матрицу смежности из этого вектора? Чтобы уточнить, матрица A должна быть такой, что A[i,j] = 1, если x[i] = x[j] и 0 в противном случае.


person user3294195    schedule 25.07.2017    source источник


Ответы (1)


В одной строке вы могли бы сделать

outer(x, x, function(x, y) as.integer(x==y))

который возвращается

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    0    0    0    0    0    1    0    0     0
 [2,]    0    1    1    1    0    1    0    0    1     0
 [3,]    0    1    1    1    0    1    0    0    1     0
 [4,]    0    1    1    1    0    1    0    0    1     0
 [5,]    0    0    0    0    1    0    0    0    0     0
 [6,]    0    1    1    1    0    1    0    0    1     0
 [7,]    1    0    0    0    0    0    1    0    0     0
 [8,]    0    0    0    0    0    0    0    1    0     0
 [9,]    0    1    1    1    0    1    0    0    1     0
[10,]    0    0    0    0    0    0    0    0    0     1

или в две строки

myMat <- outer(x, x, "==")
myMat[] <- as.integer(myMat)

Убедитесь, что они такие же.

identical(myMat, outer(x, x, function(x, y) as.integer(x==y)))
[1] TRUE

данные

set.seed(1234)
x <- sample(5, 10, replace = TRUE)
person lmo    schedule 25.07.2017
comment
Может быть, тоже sapply(seq_along(x), function(i) sapply(seq_along(x), function(j) as.integer(x[i] == x[j]))) - person d.b; 25.07.2017