2014-11-19 3 views
1

У меня есть матрица, H. Я хочу, чтобы выбрать значение из каждой строки, выбирая столбец вектора P.Подмножество матрицы в соответствии с вектором столбцы

H = matrix(data=runif(6),ncol=2) 
P = c(2,1,2) 

Выход я после того, как это вектор содержащий

c(H[1,P[1]],H[2,P[2]],H[3,P[3]]) 

Я работаю с большими данными, поэтому общий способ сделать это будет хорошо.

Это работает diag(H[,P]), но: а) Я не понимаю, почему H[,P] возвращает квадратную матрицу, и б) я бы предпочел не использовать дополнительную функцию (в данном случае diag).

Приносим извинения, если это было задано ранее.

+0

'Diag (Н [Р])' работает, потому что он добавляет столбцы до длины P перед вызовом 'diag' Это было бы менее эффективно для больших матриц. Ответ Дэвида ниже очень хороший. –

ответ

5

Попробуйте

H[cbind(seq_len(nrow(H)), P)] 
## [1] 0.6733731 0.7396847 0.5953580 

Здесь мы индексировать последовательными строк и столбцов, указанных в P


Что касается вашего вопроса, так что причина H[, P] возвращает матрицу, потому что вы говорите R:

выбрать все строки в столбцах: 2, 1, 2 из матрицы «H»

Таким образом, результат, который вы получаете, представляет собой матрицу с идентичными первой и третьей колонками.

+1

Спасибо за это. Простой тест скорости показывает, что этот подход быстрее, чем diag (H [, P]) – James

+0

'1: dim (H) [2]' был примерно в два раза быстрее, чем 'seq_len (nrow (H))' – James

+0

Для какого размера набора данных? –

0

Это работает, но: а) я не понимаю, почему Н [Р] возвращает матрицу квадрат ,

H [, P] возвращает квадратную матрицу, поскольку P является вектор длины = 3. Здесь вы в основном говорите, что хотите вернуть матрицу с столбцами 2, 1 и 2.

Если вы хотите получить одно значение, вам также нужно передать ему строку. Вы можете передать ему случайное число или что-то еще, если хотите, чтобы он случайно выбирал строку или задавал ей определенную строку. Например, строка 1:

H[1,P] 

или случайным образом (но это же по всей матрице) ряд:

H[floor(runif(1, 1, dim(H)[1])),P] 
+0

спасибо за это. Я попробовал h [1: 3, P] надеясь, что это даст мне желаемый результат, но это не сработало. – James

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