return first index for each unique value in a vector
Here are two methods:
A<-c(9,2,9,5)
f1 <- function(x) { d <- !duplicated(x) ; data.frame(uniqueValue=x[d], firstIndex=which(d)) }
f2 <- function(x) { u <- unique(x) ; data.frame(uniqueValue=u, firstIndex=match(u, x))}
f1(A)
uniqueValue firstIndex 1 9 1 2 2 2 3 5 4
identical(f1(A), f2(A))
[1] TRUE
A6 <- sample(1e6, size=5e5, replace=TRUE) system.time(z1 <- f1(A6))
user system elapsed 0.25 0.02 0.27
system.time(z2 <- f2(A6))
user system elapsed 0.09 0.02 0.11
identical(z1, z2)
[1] TRUE Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com
-----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Bronwyn Rayfield Sent: Tuesday, August 28, 2012 12:59 PM To: r-help at r-project.org Subject: [R] return first index for each unique value in a vector I would like to efficiently find the first index of each unique value in a very large vector. For example, if I have a vector A<-c(9,2,9,5) I would like to return not only the unique values (2,5,9) but also their first indices (2,4,1). I tried using a for loop with which(A==unique(A)[i])[1] to find the first index of each unique value but it is very slow. What I am trying to do is easily and quickly done with the "unique" function in MATLAB (see http://www.mathworks.com/help/techdoc/ref/unique.html). Thank you for your help, Bronwyn [[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.