Подстановка матрицы с другой матрицей в R - PullRequest
2 голосов
/ 07 марта 2020

У меня есть две матрицы, одна со значениями интереса, а другая с индексами, соответствующими столбцам в первой. Приведенный ниже код делает то, что я хочу, но его нужно будет запускать на гораздо больших матрицах и много-много раз. Моя интуиция говорит мне, что может быть более быстрый способ выполнить это, поэтому любые мысли будут оценены.

set.seed(0)
y = matrix(runif(20), 4, 5)
idx = matrix(sample(1:5, 12, replace = T), 4, 3)
z = lapply(1:nrow(y), function(i) y[i, idx[i,]])
z = do.call(rbind, z)

Ответы [ 3 ]

2 голосов
/ 07 марта 2020

1) Создать матрицу из двух столбцов, элементами которой являются номер строки и значение idx для каждой записи в idx и нижний индекс y. Затем измените размер до idx.

matrix(y[cbind(c(row(idx)), c(idx))], nrow(idx))

2) Вариант:

zz <- idx
zz[] <- y[cbind(c(row(idx)), c(idx))]

# check that result is the same as z in question
identical(zz, z)
## [1] TRUE
1 голос
/ 07 марта 2020

Вы можете преобразовать матрицу и индексы в векторы, подмножество, перестроить матрицу.

matrix(as.vector(t(y))[as.vector(t(idx+(1:(nrow(y))-1)*ncol(y)))],nrow(y),b=T)
#           [,1]      [,2]      [,3]
# [1,] 0.8966972 0.8966972 0.9082078
# [2,] 0.7176185 0.7176185 0.2655087
# [3,] 0.9919061 0.9919061 0.3841037
# [4,] 0.5728534 0.9446753 0.5728534
1 голос
/ 07 марта 2020

Транспонировать y и настроить индексы в idx.

array(t(y)[idx + (1:nrow(y) - 1) * ncol(y)], dim(idx))

#           [,1]      [,2]      [,3]
# [1,] 0.8966972 0.8966972 0.9082078
# [2,] 0.7176185 0.7176185 0.2655087
# [3,] 0.9919061 0.9919061 0.3841037
# [4,] 0.5728534 0.9446753 0.5728534
...