2013-07-21 2 views
2

я имею квадратную матрицу смежности типа данных, например:R: Условные строки Удаление и столбцов в матрице

m <- matrix(c(30, 30, 30, 30, 20, 0, 0, 
    30, 373, 30, 204, 207, 0, 290, 
    30, 30, 65, 65, 20, 35, 0, 
    30, 204, 65, 239, 38, 35, 156, 
    20, 207, 20, 38, 207, 0, 134, 
    0, 0, 35, 35, 0, 35, 0, 
    0, 290, 0, 156, 134, 0, 290), 
    nrow=7, byrow=TRUE) 

Путем сравнения верхнетреугольному + диагональные элементы, есть некоторые отходящие диагоналей равный диагонали. Я хочу удалить строки и столбцы, удовлетворяющие:

if ((m[i,j] == m[i,i]) & (m[i,j] < m[j,j])) 

Таким образом, оставив только строки/столбца, который имеет большее возникновение и вынуть строку/столбец, когда элемент всегда сосуществуют с другим.

Вывод должен быть:

373 204 
204 239 

Спасибо!

ответ

2

Вот Векторизованный подход:

i <- as.vector(row(m)) 
j <- as.vector(col(m)) 
k <- matrix(m == m[cbind(i, i)] & m < m[cbind(j, j)], nrow(m)) 

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
# [1,] FALSE TRUE TRUE TRUE FALSE FALSE FALSE 
# [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
# [3,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE 
# [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
# [5,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
# [6,] FALSE FALSE TRUE TRUE FALSE FALSE FALSE 
# [7,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE 

delete.idx <- sort(unique(i[k])) 
# [1] 1 3 5 6 7 

keep.idx <- setdiff(seq_len(nrow(m)), delete.idx) 
# [1] 2 4 

m[keep.idx, keep.idx] 
#  [,1] [,2] 
# [1,] 373 204 
# [2,] 204 239 
+0

Это именно то, что мне было нужно! Большое спасибо! – striatum

Смежные вопросы