2016-10-24 23 views
3

я извлек индексов массива некоторых элементов, которые я хочу смотреть на следующее:Лучший способ подачи, который (, arr.ind = T) обратно в матрицу в R?

mat = matrix(0,10,10) 

arrInd = which(mat ==0,arr.ind = T) 

Тогда я еще несколько операций на этой матрице и в конечном итоге с вектором или строк rowInd и вектор столбцов colInd. Я хочу, чтобы эти индексы вставляли значения в другую матрицу, например mat2. Но я не могу понять, как это сделать, не зацикливая и не выполняя модульные вычисления арифметики. Я понимаю, что я мог бы взять что-то вроде

mat2[rowInd*(colInd-1)+rowInd] 

, чтобы преобразовать обратно в 1-мерную индексацию. Но так как R, как правило, построил функции, чтобы делать такие вещи, мне было интересно, есть ли более сжатый способ сделать это? Казалось бы, естественно, что такая удобная функция обработки данных, как which(,arr.ind=T), имела бы удобный обратный.

EDIT: Я пробовал использовать mat2[rowInd,colInd], но это не сработало.

Бест,

Пол

+0

Я полагаю, что основное представление в памяти матрицы не является 2-мерным? Строки и столбцы - это только атрибуты матрицы? –

+1

@zheyuan Li: спасибо за ваш ответ. Я должен был заметить, что после манипуляций мои индексы строк и индексы столбцов были сохранены как отдельные векторы. Но, благодаря вашему ответу, теперь кажется очевидным, что мне нужен был 'mat2 [cbind (rowInd, colInd)]'. Благодаря! – Paul

ответ

1

Есть прочитанный на R intro: indexing a matrix об использовании матрицы индексации. which(, arr.ind = TRUE) возвращает матрицу с двумя столбцами, подходящую для непосредственного использования индексации матрицы. Например:

A <- matrix(c(1L,2L,2L,1L), 2) 
iv <- which(A == 1L, arr.ind = TRUE) 

#  row col 
#[1,] 1 1 
#[2,] 2 2 

A[iv] 
# [1] 1 1 

Если у вас есть другая матрица B, которые вы хотите обновить значения в соответствии с iv вобще

B[iv] <- replacement 

Может быть, по какой-то причине вы отделенной индекс строки и индекс столбца в rowInd и colInd. В этом случае просто используйте

cbind(rowInd, colInd) 

как индексирующая матрица.