Как я могу извлечь информацию о местоположении из матрицы смежности в R?

У меня есть матрица смежности, как показано ниже:

> matrix(c(0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0),ncol=4,byrow=T)
     [,1] [,2] [,3] [,4]
[1,]    0    1    0    0
[2,]    1    0    1    0
[3,]    0    1    0    1
[4,]    0    0    1    0

Вопрос 1: как мне получить соответствующую информацию, например: 2 5 7 10 12 15 из R?

Вопрос 2: как я могу получить информацию о местоположении единиц в каждой строке, например:

2 
1 3 
2 4 
3 

или 2 1 3 2 4 3из R?

Спасибо!


person Chestnut T    schedule 22.05.2019    source источник


Ответы (2)


Просто используйте which в логической матрице

which(m1 == 1)
#[1]  2  5  7 10 12 15

Если нам нужен индекс столбца в list

sapply(split(!!m1, col(m1)), which)

Или как вектор

na.omit(na_if(c(t(m1 * col(m1))), 0))
#[1] 2 1 3 2 4 3

данные

m1 <- matrix(c(0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0),ncol = 4,byrow = TRUE)
person akrun    schedule 22.05.2019
comment
Спасибо. Как насчет расположения «1» в каждой строке, например: 2 1 3 2 4 3? - person Chestnut T; 23.05.2019
comment
Используйте apply() (или аналогичный) над строками, например apply(m1, 1, function(x) which(x == 1)) - person John Colby; 23.05.2019
comment
@JohnColby - или используйте which(m1 == 1, arr.ind=TRUE), который вернет индексы строк / столбцов. - person thelatemail; 23.05.2019
comment
@ChestnutT Мой ответ был основан на вашем первоначальном вопросе, и я не знал, что вы обновите его, добавив больше вопросов. - person akrun; 23.05.2019

m <- matrix(c(0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0),ncol=4,byrow=T)
mm <- m == 1
which(mm)
#[1]  2  5  7 10 12 15
apply(mm, 1, which)
#[[1]]
#[1] 2
#
#[[2]]
#[1] 1 3
#
#[[3]]
#[1] 2 4
#
#[[4]]
#[1] 3

возможно также см. raster::adjacency

person Robert Hijmans    schedule 23.05.2019