矩阵%in%matrix

Xu *_*ang 14 r

假设我有两个矩阵,每个矩阵有两列和不同的行数.我想检查并查看另一个矩阵中哪一对矩阵.如果这些是一维的,我通常只是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)

  • 徐旺:不是"作弊",我认为你所寻找的词语是"kludgy". (4认同)

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)


Ram*_*ath 5

这是另一种使用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)