[R] Return "TRUE" only for first match of values between matrix and vector.

arun smartpink111 at yahoo.com
Sat May 3 12:43:58 CEST 2014


Hi,
This should be little more faster.


indx <- A==B
indx1 <- which(indx, arr.ind=TRUE)
indx[indx1[duplicated(indx1[,1]),]]<- FALSE
indx


##Speed comparison
##previous method
fun1 <- function(mat, vec) {
    stopifnot(dim(mat)[1] == length(vec))
    indx <- mat == vec
    t(apply(indx, 1, function(x) {
        x[duplicated(x) & !is.na(x)] <- FALSE
        x
    }))
}

##modified 
fun2 <- function(mat, vec) {
    stopifnot(dim(mat)[1] == length(vec))
    indx <- mat == vec
    indx1 <- which(indx, arr.ind = TRUE)
    indx[indx1[duplicated(indx1[, 1]), ]] <- FALSE
    indx
}
identical(fun1(A,B), fun2(A,B))
#[1] TRUE
set.seed(498)
A1 <- matrix(sample(40,1e5*500,replace=TRUE), ncol=500)
set.seed(345)
 B1 <- sample(70, 1e5, replace=TRUE)

system.time(res1 <- fun1(A1,B1))
 # user  system elapsed 
 # 7.840   0.344   8.195 

system.time(res2 <- fun2(A1,B1))
#  user  system elapsed 
#  0.304   0.080   0.382 
identical(res1,res2)
#[1] TRUE
which(rowSums(res1,na.rm=TRUE)>1)
#integer(0)

A.K.


On Friday, May 2, 2014 7:51 AM, arun <smartpink111 at yahoo.com> wrote:
Hi,
Try:
indx <- A==B
t(apply(indx,1,function(x) {x[duplicated(x) & !is.na(x)] <- FALSE; x}))
#      [,1]  [,2]  [,3]
#[1,]  TRUE FALSE FALSE
#[2,] FALSE    NA FALSE
#[3,]    NA    NA    NA
#[4,]  TRUE    NA FALSE
#[5,] FALSE  TRUE FALSE

A.K.





On Friday, May 2, 2014 4:47 AM, nevil amos <nevil.amos at gmail.com> wrote:
I wish to return " True" in a matrix for only the first match of a value
per row where the value equals that in a vector with the same number of
values as rosw in the matrix

eg:
A<-matrix(c(2,3,2,1,1,2,NA,NA,NA,5,1,0,5,5,5),5,3)
B<-c(2,1,NA,1,5)
desired result:

      [,1] [,2]  [,3]
[1,]  TRUE FALSE FALSE
[2,] FALSE   NA FALSE
[3,]    NA   NA    NA
[4,]  TRUE   NA FALSE
[5,] FALSE TRUE  FALSE

however A==B returns:
      [,1] [,2]  [,3]
[1,]  TRUE TRUE FALSE
[2,] FALSE   NA FALSE
[3,]    NA   NA    NA
[4,]  TRUE   NA FALSE
[5,] FALSE TRUE  TRUE
and
apply(A,1,function(x) match (B,x))
returns
     [,1] [,2] [,3] [,4] [,5]
[1,]    1   NA    1   NA   NA
[2,]    3   NA   NA    1    1
[3,]   NA    2    2    2   NA
[4,]    3   NA   NA    1    1
[5,]   NA   NA    3    3    2

thanks

    [[alternative HTML version deleted]]

______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list