假设我有两个矩阵,每个矩阵有两列,行数不同。我想要检查并查看一个矩阵的哪些对在另一个矩阵中。如果这些是一维的,我通常只会做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我希望结果是c(FALSE,TRUE,TRUE,FALSE)。
发布于 2011-10-30 17:05:09
另一种方法是:
> paste(a[,1], a[,2], sep="$$") %in% paste(x[,1], x[,2], sep="$$")
[1] FALSE TRUE TRUE FALSE更通用的版本是:
> apply(a, 1, paste, collapse="$$") %in% apply(x, 1, paste, collapse="$$")
[1] FALSE TRUE TRUE FALSE发布于 2011-10-30 15:21:05
重新创建数据:
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)定义一个类似于%in%的矩阵函数%inm%
`%inm%` <- function(x, matrix){
test <- apply(matrix, 1, `==`, x)
any(apply(test, 2, all))
}将此应用于您的数据:
apply(a, 1, `%inm%`, x)
[1] FALSE TRUE TRUE FALSE要比较单行,请执行以下操作:
a[1, ] %inm% x
[1] FALSE
a[2, ] %inm% x
[1] TRUE发布于 2011-10-30 17:09:32
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)))
}对比:
> 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编辑:
我检查了被接受的答案,只是为了好玩。比double apply执行得更好(因为您去掉了内部循环),但递归仍然是规则!;-)
> system.time(apply(a, 1, paste, collapse="$$") %in%
+ apply(x, 1, paste, collapse="$$"))
user system elapsed
6.40 0.01 6.41 https://stackoverflow.com/questions/7943695
复制相似问题