Вот быстрое решение, которое должно давать тот же результат, что и ваш:
set.seed(13)
A <- matrix(letters[1:5])
B <- matrix(sample(letters, 12, rep(T)), 4)
x <- match(toupper(A), toupper(B), nomatch=0L)
x <- (x[x>0L]-1L) %% nrow(B) + 1L
output <- B[x, , drop=FALSE]
Это работает с помощью match
, чтобы найти (векторные) индексы в B, где A соответствует.Затем он преобразует эти индексы в индексы строк и, наконец, извлекает эти строки.
.. Обратите внимание, что строка B[2,]
включена дважды в вывод - это действительно то, что вы хотите?Если нет, измените последнюю строку на:
output <- B[unique(x), , drop=FALSE]
РЕДАКТИРОВАТЬ Некоторые моменты времени.Я удалил вызовы toupper
, так как это доминирует во времени, и @Manuel Ramon не звонил.Обратите внимание, что все наши результаты разные!Так что некоторая отладка, вероятно, оправдана; -)
# Create huge A and B matrices
set.seed(13)
strs <- outer(letters, LETTERS, paste)
A <- matrix(strs)
B <- matrix(sample(strs, 1e7, rep(T)), 1e4)
# My solution: 0.24 secs
system.time({
x <- match(A, B, nomatch=0L)
x <- (x[x>0L]-1L) %% nrow(B) + 1L
output1 <- B[unique(x), , drop=FALSE]
})
# @DWin's solution: 0.91 secs
system.time({
idx <- unique(which(as.matrix(B) %in% A, arr.ind=TRUE) %% NROW(B))
idx[idx==0] <- 4
output2 <- B[idx, , drop=FALSE]
})
# @Manuel Ramon's solution: 0.89 secs
system.time({
id <- apply(B, 2, function(x) A %in% x)
output3 <- B[apply(id,1,sum)>0, ]
})