Заменить первый нулевой элемент строки матрицы, - PullRequest
1 голос
/ 19 января 2012

Как можно быстрее, я хотел бы заменить первые нули в некоторых строках матрицы значениями, хранящимися в другом векторе.

Существует числовая матрица, в которой каждая строка представляет собой вектор с несколькими нулями.У меня также есть два вектора, один из которых содержит строки, в которых нужно заменить, а другой - новые значения: replace.in.these.rows и new.values.Кроме того, я могу сгенерировать вектор первых нулей с помощью sapply

mat <- matrix(1,5,5)
mat[c(1,8,10,14,16,22,14)] <- 0
replace.in.these.rows <- c(1,2,3)
new.values <- c(91,92,93)

corresponding.poz.of.1st.zero <- sapply(replace.in.these.rows, 
                                        function(x) which(mat [x,] == 0)[1] )

Теперь я хотел бы что-то, что перебирает индексные векторы, но без цикла for возможно:

matrix[replace.in.these.rows, corresponding.poz.of.the.1st.zero ] <- new.values 

Есть ли уловка с индексированием более простых векторов?Он не может использовать список или массив (например, по столбцам) в качестве индекса.

По умолчанию матрицы R представляют собой набор векторов столбцов.Получу ли я что-нибудь, если буду хранить данные в транспонированной форме?Это означало бы работать со столбцами вместо строк.


Контекст :

В этой матрице хранятся идентификаторы контактов сети.Это не матрица смежности nxn, а матрица nx max.number.of.partners (или n * = 30).

В сети по умолчанию используется список краев, но я хотел сохранить все ссылки из X"Вместе.

Я предположил, но не уверен, что это более эффективно, чем всегда извлекать информацию из списка краев (несколько раз каждый раунд в симуляции)

Я также предполагал, что это линейно растетматричная форма быстрее, чем хранение той же информации в том же отформатированном списке.

Приветствуются также некоторые комментарии к этим контекстным предположениям.

1 Ответ

1 голос
/ 19 января 2012

Редактировать: если заменить только первые нули, то этот подход работает:

first0s <-apply(mat[replace.in.these.rows, ] , 1, function(x) which(x==0)[1])
mat[cbind(replace.in.these.rows, first0s)] <- new.values
> mat
     [,1] [,2] [,3] [,4] [,5]
[1,]   91    1    1    0    1
[2,]    1    1    1    1   92
[3,]    1   93    1    1    1
[4,]    1    1    0    1    1
[5,]    1    0    1    1    1

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

 idxs <- which(mat==0, arr.ind=TRUE)
# This returns that rows and columns that identify the zero elements
# idxs[,"row"] %in% replace.in.these.rows
#  [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE
# That isolates the ones you want.
# idxs[ idxs[,"row"] %in% replace.in.these.rows , ]
# that shows what you will supply as the two column argument to "["
#     row col
#[1,]   1   1
#[2,]   3   2
#[3,]   1   4
#[4,]   2   5
 chosen.ones <- idxs[ idxs[,"row"] %in% replace.in.these.rows , ]
 mat[chosen.ones] <- new.values[chosen.ones[,"row"]]
# Replace the zeros with the values chosen (and duplicated if necessary) by "row".
 mat
 #---------    
 [,1] [,2] [,3] [,4] [,5]
[1,]   91    1    1   91    1
[2,]    1    1    1    1   92
[3,]    1   93    1    1    1
[4,]    1    1    0    1    1
[5,]    1    0    1    1    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...