I would typically use rle() for this kind of thing: > tmp <- cumsum(rle(id)$lengths) > c(1, tmp[-length(tmp)]+1) [1] 1 4 9
It does assume that all rows for each unique value of id are grouped together, but does not require that the rows be sorted by id. -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 On 6/13/13 12:56 AM, "Gallon Li" <gallon...@gmail.com> wrote: >suppose I have the following data > >id=c(rep(1,3),rep(2,5),rep(3,4)) >time=c(seq(1,3),seq(2,6),seq(1,4)) > >ds=cbind(id,time) > >> ds > id time > [1,] 1 1 > [2,] 1 2 > [3,] 1 3 > [4,] 2 2 > [5,] 2 3 > [6,] 2 4 > [7,] 2 5 > [8,] 2 6 > [9,] 3 1 >[10,] 3 2 >[11,] 3 3 >[12,] 3 4 > >i want to return a vector that indicates the position of the first >observation for each id. for the above data, i wish to get (1,4,9). > >is it possible to get this quickly>? > > [[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.