[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