[R] return first index for each unique value in a vector

William Dunlap wdunlap at tibco.com
Wed Aug 29 05:22:36 CEST 2012


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.




More information about the R-help mailing list