[R] Create a new var reflecting the order of subjects in existing var

Gabor Grothendieck ggrothendieck at gmail.com
Mon Apr 2 17:26:06 CEST 2007


Just noticed one should use seq_along instead of seq in both
my post and Jim's to include the case where dat only has one
row.

On 4/2/07, Nguyen Dinh Nguyen <n.nguyen at garvan.org.au> wrote:
> Dear R users,
>
> Followings are summary the solutions for my question.
> All the way to Roma!
>
> But vote #1 for Jim, the simplest solution.
>
> Thank you all of you for yours quick response
>
> Regards
>
> Nguyen
>
>
>
> # I have a data set sth like this:
>
>
>
> set.seed(123);dat <- data.frame(ID= c(rep(1,2),rep(2,3), rep(3,3), rep(4,4),
> rep(5,5)),
>
>                  var1 =rnorm(17, 35,2),
>
>                  var2=runif(17,0,1))
>
>
>
> # I would like to create a new var in dat which reflects the order of each
> subject (ID), like this
>
> #   ID     var1       var2     IDorder
>
> # 1   1 33.87905 0.02461368       1
>
> # 2   1 34.53965 0.47779597       2
>
> # 3   2 38.11742 0.75845954       1
>
> # 4   2 35.14102 0.21640794       2
>
> # 5   2 35.25858 0.31818101       3
>
> # 6   3 38.43013 0.23162579       1
>
> # 7   3 35.92183 0.14280002       2
>
> # 8   3 32.46988 0.41454634       3
>
> # 9   4 33.62629 0.41372433       1
>
> # 10  4 34.10868 0.36884545       2
>
> # 11  4 37.44816 0.15244475       3
>
> # 12  4 35.71963 0.13880606       4
>
> # 13  5 35.80154 0.23303410       1
>
> # 14  5 35.22137 0.46596245       2
>
> # 15  5 33.88832 0.26597264       3
>
> # 16  5 38.57383 0.85782772       4
>
> # 17  5 35.99570 0.04583117       5
>
>
>
>
>
> ##SOLUTIONS
>
>
>
> # 1st (by Christos Hatzis)
>
> y <- rle(dat$ID) # rle: Run Length Endcoding
>
> dat$IDorder1 <- unlist(sapply(y$lengths, FUN=function(x) seq(1,x)))
>
> dat
>
>
>
> # 2st (by Chaliraos Skiadas)
>
> dat$IDorder2 <- unlist(tapply(dat$ID,factor(dat$ID), function(x)
>
> 1:length(x)),use.names=FALSE)
>
> dat
>
>
>
> #3rd (Jim Holtman)
>
> dat$IDorder3 <- ave(dat$ID, dat$ID, FUN=seq)
>
>
>
> #4 (Gabor Grothendieck)   Assuming the ID's are contiguous
>
> dat <- transform(dat, IDorder3 = seq(ID) - match(ID, ID) + 1)
>
> dat
>
>
>
> #5th   (Milton Cezar Ribeiro)
>
> ID.freq<-table(dat$ID)
>
> ID.freq
>
> ID.seq<-NULL
>
> for (i in names(ID.freq))
>
>  {
>
>  ID.seq<-c(ID.seq,seq(from=1, to=ID.freq[i], by=1))
>
>  }
>
> dat$ID.seq<-ID.seq
>
> dat
>
> # END
>
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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