Ответ 1
Быстрый способ для этого размера должен быть:
require(data.table)
M1 = setkey(data.table(m1))
M2 = setkey(data.table(m2))
na.omit(
M2[M1,which=TRUE]
)
[1] 1 2
Существует ли быстрый способ нахождения строк в матрице A в матрице B? например
m1 = matrix(c(1:6), ncol=2, byrow = T); m2 = matrix(c(1:4), ncol=2, byrow=T);
и результат будет равен 1, 2.
Матрицы не имеют одинакового количества строк (количество столбцов одинаковое), и они несколько большие - от 10 ^ 6 - 10 ^ 7 строк.
Самый быстрый способ сделать это, о котором я знаю сейчас:
duplicated(rbind(m1, m2))
Tnx!
Быстрый способ для этого размера должен быть:
require(data.table)
M1 = setkey(data.table(m1))
M2 = setkey(data.table(m2))
na.omit(
M2[M1,which=TRUE]
)
[1] 1 2
Я создал эту функцию, которая вернет исходный идентификатор. Например, вы хотите сопоставить матрицу x с матрицей y, она вернет идентификатор совпадения y.
rowiseMatch2 <- function(x,y){
require(data.table)
keycols <- colnames(x)
x <- cbind(x, id=1:nrow(x))
y <- cbind(y, id=1:nrow(y))
m1 = data.table(x)
setkeyv(m1, keycols)
m2 = data.table(y)
setkeyv(m2, keycols)
m1id <- m1$id
m2id <- m2$id
m1$id <- NULL
m2$id <- NULL
m <- na.omit(m2[m1,which=TRUE])
mo <- m2id[m][order(m1id)]
if(length(mo) == nrow(x)){
cat("Complete match!\n")
}else{
cat("Uncomplete match, match percentage is:", round(length(mo)/nrow(x), 4)*100, "%\n")
}
return(as.integer(mo))
}