Dear R Helpers, I am missing something very elementary here, and I don't seem to get it from the help pages of the ave, seq and seq_along functions, so I wonder if you could offer a quick help. To use an example from an earlier post on this list, I have a dataframe of this kind: dat = data.frame(name = rep(c("Mary", "Sam", "John"), c(3,2,4))) dat$freq = ave(seq_along(dat$name), dat$name, FUN = seq_along) dat name freq 1 Mary 1 2 Mary 2 3 Mary 3 4 Sam 1 5 Sam 2 6 John 1 7 John 2 8 John 3 9 John 4 What I need is another column assigning a number to each name starting from index 100, that is: name freq nb 1 Mary 1 100 2 Mary 2 100 3 Mary 3 100 4 Sam 1 101 5 Sam 2 101 6 John 1 102 7 John 2 102 8 John 3 102 9 John 4 102 What is the easiest way to do this? Thanks a lot for your kind help. Dana
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 Dana Sevak > Sent: Saturday, November 21, 2009 4:00 PM > To: r-help at r-project.org > Subject: [R] Help with indexing > > Dear R Helpers, > > I am missing something very elementary here, and I don't seem > to get it from the help pages of the ave, seq and seq_along > functions, so I wonder if you could offer a quick help. > > To use an example from an earlier post on this list, I have a > dataframe of this kind: > > dat = data.frame(name = rep(c("Mary", "Sam", "John"), c(3,2,4))) > dat$freq = ave(seq_along(dat$name), dat$name, FUN = seq_along) > > dat > name freq > 1 Mary 1 > 2 Mary 2 > 3 Mary 3 > 4 Sam 1 > 5 Sam 2 > 6 John 1 > 7 John 2 > 8 John 3 > 9 John 4 > > What I need is another column assigning a number to each name > starting from index 100, that is: > > name freq nb > 1 Mary 1 100 > 2 Mary 2 100 > 3 Mary 3 100 > 4 Sam 1 101 > 5 Sam 2 101 > 6 John 1 102 > 7 John 2 102 > 8 John 3 102 > 9 John 4 102 > > What is the easiest way to do this?match() will do it: > match(names, unique(names)) + 99 [1] 100 100 100 101 101 102 102 102 102 Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> Thanks a lot for your kind help. > > Dana > > ______________________________________________ > 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. >
try this:> # create a factor and then convert back to numeric > x$nb <- as.integer(factor(x$name, levels=unique(x$name))) + 99 > xname freq nb 1 Mary 1 100 2 Mary 2 100 3 Mary 3 100 4 Sam 1 101 5 Sam 2 101 6 John 1 102 7 John 2 102 8 John 3 102 9 John 4 102 On Sat, Nov 21, 2009 at 7:00 PM, Dana Sevak <dana.sevak at yahoo.com> wrote:> Dear R Helpers, > > I am missing something very elementary here, and I don't seem to get it from the help pages of the ave, seq and seq_along functions, so I wonder if you could offer a quick help. > > To use an example from an earlier post on this list, I have a dataframe of this kind: > > dat = data.frame(name = rep(c("Mary", "Sam", "John"), c(3,2,4))) > dat$freq = ave(seq_along(dat$name), dat$name, FUN = seq_along) > > dat > ?name freq > 1 Mary ? ?1 > 2 Mary ? ?2 > 3 Mary ? ?3 > 4 ?Sam ? ?1 > 5 ?Sam ? ?2 > 6 John ? ?1 > 7 John ? ?2 > 8 John ? ?3 > 9 John ? ?4 > > What I need is another column assigning a number to each name starting from index 100, that is: > > ?name freq ?nb > 1 Mary ? ?1 100 > 2 Mary ? ?2 100 > 3 Mary ? ?3 100 > 4 ?Sam ? ?1 101 > 5 ?Sam ? ?2 101 > 6 John ? ?1 102 > 7 John ? ?2 102 > 8 John ? ?3 102 > 9 John ? ?4 102 > > What is the easiest way to do this? > > Thanks a lot for your kind help. > > Dana > > ______________________________________________ > 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve?