假设我有两个矩阵,每个矩阵有两列和不同的行数.我想检查并查看另一个矩阵中哪一对矩阵.如果这些是一维的,我通常只是a %in% x
为了得到我的结果.match
似乎只对矢量有效.
> a
[,1] [,2]
[1,] 1 2
[2,] 4 9
[3,] 1 6
[4,] 7 7
> x
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
Run Code Online (Sandbox Code Playgroud)
我希望结果如此c(FALSE,TRUE,TRUE,FALSE)
.
And*_*rie 11
重新创建您的数据:
a <- matrix(c(1, 2, 4, 9, 1, 6, 7, 7), ncol=2, byrow=TRUE)
x <- matrix(c(1, 6, 2, 7, 3, 8, 4, 9, 5, 10), ncol=2, byrow=TRUE)
Run Code Online (Sandbox Code Playgroud)
定义一个%inm%
矩阵模拟函数%in%
:
`%inm%` <- function(x, matrix){
test <- apply(matrix, 1, `==`, x)
any(apply(test, 2, all))
}
Run Code Online (Sandbox Code Playgroud)
将此应用于您的数据:
apply(a, 1, `%inm%`, x)
[1] FALSE TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
要比较一行:
a[1, ] %inm% x
[1] FALSE
a[2, ] %inm% x
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
Pat*_*rns 10
另一种方法是:
> paste(a[,1], a[,2], sep="$$") %in% paste(x[,1], x[,2], sep="$$")
[1] FALSE TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
更一般的版本是:
> apply(a, 1, paste, collapse="$$") %in% apply(x, 1, paste, collapse="$$")
[1] FALSE TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
Jor*_*eys 10
Andrie的解决方案非常好.但是如果你有大矩阵,你可能想尝试基于递归的其他东西.如果按列工作,则可以通过排除第一个位置不匹配的所有内容来减少计算时间:
fastercheck <- function(x,matrix){
nc <- ncol(matrix)
rec.check <- function(r,i,id){
id[id] <- matrix[id,i] %in% r[i]
if(i<nc & any(id)) rec.check(r,i+1,id) else any(id)
}
apply(x,1,rec.check,1,rep(TRUE,nrow(matrix)))
}
Run Code Online (Sandbox Code Playgroud)
比较:
> set.seed(100)
> x <- matrix(runif(1e6),ncol=10)
> a <- matrix(runif(300),ncol=10)
> a[c(3,7,9,15),] <- x[c(1000,48213,867,20459),]
> system.time(res1 <- a %inm% x)
user system elapsed
31.16 0.14 31.50
> system.time(res2 <- fastercheck(a,x))
user system elapsed
0.37 0.00 0.38
> identical(res1, res2)
[1] TRUE
> which(res2)
[1] 3 7 9 15
Run Code Online (Sandbox Code Playgroud)
编辑:
我检查了接受的答案只是为了好玩.执行比双重应用更好(因为你摆脱了内部循环),但递归仍然是规则!;-)
> system.time(apply(a, 1, paste, collapse="$$") %in%
+ apply(x, 1, paste, collapse="$$"))
user system elapsed
6.40 0.01 6.41
Run Code Online (Sandbox Code Playgroud)
这是另一种使用digest
包并checksums
为每行创建的方法,这些方法是使用散列算法生成的(默认为md5
)
a <- matrix(c(1, 2, 4, 9, 1, 6, 7, 7), ncol=2, byrow=TRUE)
x <- matrix(c(1, 6, 2, 7, 3, 8, 4, 9, 5, 10), ncol=2, byrow=TRUE)
apply(a, 1, digest) %in% apply(x, 1, digest)
[1] FALSE TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)