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-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of Bronwyn Rayfield > Sent: Tuesday, August 28, 2012 12:59 PM > To: r-help@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@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. ______________________________________________ R-help@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.