這裏有一個快速的解決方案,應該給予同樣的輸出你的:
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中的(矢量)標w這裏有一場比賽。然後它將這些索引轉換爲行索引,最後提取這些行。
..注意行B[2,]
在輸出中包含兩次 - 這真的是你想要的嗎?如果沒有,更改最後一行:
output <- B[unique(x), , drop=FALSE]
編輯一些時機。自從那個時代佔據主導地位以來,我刪除了toupper
的電話號碼,@曼努埃爾拉蒙並沒有這麼稱呼。請注意,我們所有的輸出是不同的!所以一些調試可能是有保證的;-)
# 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, ]
})
B矩陣真的是矩陣嗎?或者它是'data.frame'?一個「矩陣」只能有一種類型 - 所以所有的值都是字符串,然後... – Tommy