[R] Loops to assign a unique ID to a column

Bert Gunter gunter.berton at gene.com
Tue Aug 2 18:31:41 CEST 2011


Whoa!

1. First and most important, there is very likely no reason you need
to do this. R can handle multiple groupings automatically in fitting
and plotting without creating artificial labels of the sort you appear
to want to create. Please read an "Intro to R" and/or get help to see
how.

2. The "solution" offered below is unnecessarily convoluted. Here is a
simpler and faster one:

z <-  within(z, indx <- as.numeric(interaction(Dates,Groups,
              drop=TRUE, lex.order=TRUE)))


Explanation:

interaction() produces all possible combinations the individual
groupings; drop=FALSE throws away any unused combinations,
lex.order-TRUE lexicographically orders the levels as you indicated.
?interaction for details.
By default, the result of the above is a factor, which as.numeric()
converts to the numeric codes used in factor representations. ?factor
 .
Finally, within() interprets and makes changes within z. The changed
result is then assigned back to z so that it is not lost. ?within

Cheers,
Bert

On Tue, Aug 2, 2011 at 8:36 AM, David L Carlson <dcarlson at tamu.edu> wrote:
> How about this?
>
>> indx <- unique(cbind(Dates, Groups))
>> indx
>     Dates        Groups
> [1,] "12/10/2010" "A"
> [2,] "12/10/2010" "B"
> [3,] "13/10/2010" "A"
> [4,] "13/10/2010" "B"
> [5,] "13/10/2010" "C"
>
>> indx <- data.frame(indx, id=1:nrow(indx))
>> indx
>       Dates Groups id
> 1 12/10/2010      A  1
> 2 12/10/2010      B  2
> 3 13/10/2010      A  3
> 4 13/10/2010      B  4
> 5 13/10/2010      C  5
>
>> newdata <- merge(data, indx)
>> newdata
>       Dates Groups id
> 1 12/10/2010      A  1
> 2 12/10/2010      B  2
> 3 12/10/2010      B  2
> 4 13/10/2010      A  3
> 5 13/10/2010      B  4
> 6 13/10/2010      C  5
>
> ----------------------------------------------
> David L Carlson
> Associate Professor of Anthropology
> Texas A&M University
> College Station, TX 77843-4352
>
>
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
> Behalf Of Chandra Salgado Kent
> Sent: Tuesday, August 02, 2011 2:12 AM
> To: r-help at r-project.org
> Subject: [R] Loops to assign a unique ID to a column
>
> Dear R help,
>
>
>
> I am fairly new in data management and programming in R, and am trying to
> write what is probably a simple loop, but am not having any luck. I have a
> dataframe with something like the following (but much bigger):
>
>
>
> Dates<-c("12/10/2010","12/10/2010","12/10/2010","13/10/2010", "13/10/2010",
> "13/10/2010")
>
> Groups<-c("A","B","B","A","B","C")
>
> data<-data.frame(Dates, Groups)
>
>
>
> I would like to create a new column in the dataframe, and give each distinct
> date by group a unique identifying number starting with 1, so that the
> resulting column would look something like:
>
>
>
> ID<-c(1,2,2,3,4,5)
>
>
>
> The loop that I have started to write is something like this (but doesn't
> work!):
>
>
>
> data$ID<-as.number(c())
>
> for(i in unique(data$Dates)){
>
>  for(j in unique(data$Groups)){ data$ID[i,j]<-i
>
>  i<-i+1
>
>  }
>
> }
>
>
>
> Am I on the right track?
>
>
>
> Any help on this is much appreciated!
>
>
>
> Chandra
>
>
>        [[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.
>
> ______________________________________________
> 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.
>



-- 
"Men by nature long to get on to the ultimate truths, and will often
be impatient with elementary studies or fight shy of them. If it were
possible to reach the ultimate truths without the elementary studies
usually prefixed to them, these would not be preparatory studies but
superfluous diversions."

-- Maimonides (1135-1204)

Bert Gunter
Genentech Nonclinical Biostatistics



More information about the R-help mailing list