在R中找到非第一场比赛

时间:2018-04-10 10:21:56

标签: r

我知道match(x,y)返回y中所有x元素的第一个匹配项。

假设x可能多次包含相同的值,我正在寻找一种简洁的方法来匹配x中的第n次出现和y中出现的第n次。

例如:`

x <- c(3,4,4,3,2,4)
y <- c(1,2,3,4,1,2,3,4)

my.match(x, y)
## 3,4,8,7,2,NA

2 个答案:

答案 0 :(得分:1)

使用for循环来匹配,存储和覆盖与NA的匹配。

idx <- c()
for (i in x) {
    k <- match(i, y)
    idx <- c(idx, k)
    y[k] <- NA
}
idx

#[1]  3  4  8  7  2 NA

答案 1 :(得分:0)

向量大时,以下函数会更快,因为它不会遍历整个向量

my.match <- function(x,y){
  fidx <- rep(FALSE,length(x))
  fidy <- rep(FALSE,length(y))
  ret <- rep(NA,length(x))
  repeat{
    nidx <- which(!fidx)
    nidy <- which(!fidy) 
    idx <- match(x[nidx],y[nidy]) 
    idy <- match(y[nidy],x[nidx]) 
    ret[nidx] <- nidy[idx]
    fidx[nidx[unique(idy)]] <- TRUE
    fidy[nidy[unique(idx)]] <- TRUE
    if(sum(!is.na(idx))==0 | sum(!is.na(idy))==0){
      break
    }
  }
  return(ret)    
} 

使用其他提议的方法进行基准测试会产生:

my.match1 <- function(x,y){
  idx <- c()
  for (i in x) {
    k <- match(i, y)
    idx <- c(idx, k)
    y[k] <- NA
  }
  return(idx)
 }
x <- sample.int(100,10000,replace=T)
y <- sample.int(100,10000,replace=T)
system.time(my.match1(x,y))
##  user  system elapsed 
## 1.016   0.003   1.020 
system.time(my.match(x,y))
## user  system elapsed 
## 0.049   0.000   0.049