Hi, Here's one way to approach it, using the coercion of factor to numeric.
Note that I changed your data.frame() statement to avoid coercing strings to factors, just to make it simpler to set the levels. dat1 <-data.frame(N=seq(1, 12,1), B=c("29_log","29_log", "29_log", "27_cat", "27_cat", "1_log", "1_log", "1_log", "1_log", "1_log", "3_cat", "3_cat"), stringsAsFactors=FALSE) dat1$C1 <- as.numeric(factor(dat1$B, levels=unique(dat1$B))) And here's a way using rle() dat1$C2 <- rep(seq_len(length(unique(dat1$B))), times=rle(as.vector(dat1$B))$lengths) (That second will work even if B is a factor.) > dat1 N B C1 C2 1 1 29_log 1 1 2 2 29_log 1 1 3 3 29_log 1 1 4 4 27_cat 2 2 5 5 27_cat 2 2 6 6 1_log 3 3 7 7 1_log 3 3 8 8 1_log 3 3 9 9 1_log 3 3 10 10 1_log 3 3 11 11 3_cat 4 4 12 12 3_cat 4 4 Sarah On Fri, May 11, 2018 at 1:52 PM, Ding, Yuan Chun <ycd...@coh.org> wrote: > Hi All, > > I have a data frame dat1: > dat1 <-data.frame(N=seq(1, 12,1), B=c("29_log","29_log", "29_log", "27_cat", > "27_cat", > > "1_log", "1_log", "1_log", "1_log", "1_log", > > "3_cat", "3_cat")) > > Then I need to add one column or variable to reflect uniqueness of B variable > in sequential order as below. > dat1$C <-c(1,1,1,2,2,3,3,3,3,3,4,4) > > I only show 12 rows, my real data frame has over 1000 rows, I can not > manually to add column C. > > It should be easy, but I can not figure out. Can you help me? > > Thanks, > > Ding > -- Sarah Goslee http://www.functionaldiversity.org ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.