[R] looping using combinatorics

Jesse Albert Canchola jesse.canchola.b at bayer.com
Fri Jul 14 20:52:20 CEST 2006


Thanks.  It is actually the rows I want to choose from, not the columns 
(the columns will remain the same with the same names). A slighly 
abbreviated and modifed example:

data frame "a" has
ID  meas index
1   1.1  1
2   2.1  1

data frame "b" has
ID meas index
3  1.2  2
4  2.2  2

data frame "c" has
ID meas index
5 1.3  3
6 1.4  3

rbind the three frames "a", "b", and "c" into "d":
ID  meas  index
1   1.1  1
2   2.1  1
3   1.2   2
4   2.2   2
5  1.3   3 
6  1.4   3

The three (3 choose 2) pairs we want will be as follows.
Using "combn" from the "combinat" package on CRAN, we get the pairs (1,2), 
(1,3), (2,3) which can be used as the index in the "for" loop (as you have 
used below):
In this case, the pairs (1,2) refer to the actual subset of the data frame 
"d", above, where the actual variable named index=1 or index=2 (and so on 
for the other pairs). 

So the firstly chosen pair would be (1,2) and the resulting subset of the 
data frame "d" looks like this:
ID  meas  index
1   1.1  1
2   2.1  1
3   1.2   2
4   2.2   2

and so on for the other pairs.  So the "rbind" is correct it is the "for" 
loop that needs to be modified to grab the subsets from the DF frame below 
(i.e., the (1,2) pair selected by the combn function will select data from 
DF where the actual variable index=1 or index=2 ; using the example 
above).

#### BEGIN CODE ####
DF <- rbind(a,b,c)
DF
for(index in as.data.frame(combn(3,2))) print(DF[,index])
#### END CODE ####



Regards,
Jesse








"Gabor Grothendieck" <ggrothendieck at gmail.com> 
07/14/2006 11:01 AM

To
"Jesse Albert Canchola" <jesse.canchola.b at bayer.com>
cc
r-help at stat.math.ethz.ch
Subject
Re: [R] looping using combinatorics






Use data.frame, not rbind, e.g. DF <- data.frame(a, b, c)

On 7/14/06, Jesse Albert Canchola <jesse.canchola.b at bayer.com> wrote:
> Many thanks, Gabor.  This is very close to what would be ideal.  You 
gave
> me an idea as follows:
>
> Rather than combine pairs of data vectors/frames AFTER the "combn"
> function, combine all data before (though I belive this would be less
> efficient) and add an index then use that index to choose your pairs (or
> whatever combinatorics you are using; e.g., 8 choose 4  so all
> combinations of 4 out of 8 for a total of 70 combinations.)
>
> Example data frames with variable names:
>
> Data frame "a" where I add an "index":
> id measure index
> 1  1.1  1
> 2  1.2  1
> 3  1.3  1
>
> Data frame "b" where I add an "index":
> id measure index
> 4  2.1  2
> 5  2.2  2
> 6  2.3  2
>
> Data frame "c" where I add an index:
> id measure index
> 7  3.1  3
> 8  3.2  3
> 9  3.3  3
>
> If we combine all these data at once using rbind, we get:
> id measure index
> 1  1.1  1
> 2  1.2  1
> 3  1.3  1
> 4  2.1  2
> 5  2.2  2
> 6  2.3  2
> 7  3.1  3
> 8  3.2  3
> 9  3.3  3
>
> We can then use something similar to your code and the index to choose 
the
> required pairs as derived from the "combn" function.
> For example, the "combn" function will choose the data pairs
> (1,2)
> (1,3)
> (2,3)
>
> where, for example, the pairs (1,2) will have data from frames "a" and
> "b":
> 1  1.1  1
> 2  1.2  1
> 3  1.3  1
> 4  2.1  2
> 5  2.2  2
> 6  2.3  2
>
> so that we can go down the list subsetting what we need and doing
> operations on each combined pair as we go.
>
> Is there an easy way in R to do this operation?
>
> For the above, an attempt might be:
>
> ########## STAB CODE #########
> DF <- rbind(a,b,c)
> DF
> for(index in as.data.frame(combn(3,2))) print(DF[,index])
> ######## END STAB CODE ######
>
> but this is choosing 3 choose 2 COLUMNS within the combined file rather
> than 3 choose 2 ROWS.
>
>
> Best regards and TIAA,
> Jesse
>
>
>
>
>
> "Gabor Grothendieck" <ggrothendieck at gmail.com>
> 07/13/2006 07:39 PM
>
> To
> "Jesse Albert Canchola" <jesse.canchola.b at bayer.com>
> cc
> r-help at stat.math.ethz.ch
> Subject
> Re: [R] looping using combinatorics
>
>
>
>
>
>
> I assume your question is given 3 vectors of the same length: a, b and c
> how do we loop over pairs of them.  In the following each iteration
> displays
> one pair:
>
>   library(combinat)
>   DF <- data.frame(a = 1:4, b = 5:8, c = 9:12)
>   for(idx in as.data.frame(combn(3,2))) print(DF[,idx])
>
> On 7/13/06, Jesse Albert Canchola <jesse.canchola.b at bayer.com> wrote:
> > I have a problem where I need to loop over the total combinations of
> > vectors (combined once chosen via combinatorics).  Here is a
> > simplification of the problem:
> >
> > STEP 1:  Define three vectors a, b, c.
> > STEP 2:  Combine all possible pairwise vectors (i.e., 3 choose 2 = 3
> > possible pairs of vectors: ab,ac, bc)
> > NOTE:  the actual problem has 8 choose 4, 8 choose 5 and 8 choose 6
> > combinations.
> > STEP 3:  Do the same math on each pairwise combination and spit out
> > answers each time
> >
> > ####### BEGIN CODE #######
> > #STEP 1
> > a1 <- c(1,2,3,4,5,6,7,8,9,10,11,12)
> > a <- matrix(a1,2,3,byrow=T)
> > a
> >
> > b1 <- c(13,14,15,16,17,18,19,20,21,22,23,24)
> > b <- matrix(b1,2,3,byrow=T)
> > b
> >
> > c1 <- c(25,26,27,28,29,30,31,32,33,34,35,36)
> > c <- matrix(b1,2,3,byrow=T)
> > c
> >
> > # example:  combine the first two vectors "a" and "b"
> > combab <- rbind(a,b)
> >
> > # the a,b combined data from the algorithm later below should look 
like
> > # something like the following:
> > combab
> >
> > # use the combinatorics "combn" function found in the "combinat" 
package
> > on CRAN
> > m <- combn(3,2) # three choose two combinations
> > m
> >
> > # the first assignment below should be numeric and then subsequent
> > # assignments as character since the first time you assign a number to
> > # a character in a matrix the rest of the numbers in the matrix are
> > coerced to character
> > m[m==1]='a'; m[m=='2']='b'; m[m=='3']='c'
> > m
> >
> > #STEP 2: combine pairwise vectors into a matrix or frame
> > for (i in dim(m)[1])
> >    for (j in dim(m)[2])
> >        {
> >            combined <-
> > rbind(cat(format(m[i]),"\n"),cat(format(m[j]),"\n")) #cat/format 
removes
> > the quotes
> >            combined
> >        }
> > traceback()
> >
> >
> > #STEP 3: {not there yet}
> > ################# END CODE ################
> >
> > The problem is that in STEP 2 (not complete), the results in the rbind
> are
> > not recognized as the objects they represent (i.e., the "a" without
> quotes
> > is not recognized as the data object we defined in STEP 1.  Perhaps 
this
> > is a parsing problem.  Perhaps there is an alterative way to do this. 
I
> > looked pretty long and hard in the CRAN libraries but alas, I am 
stuck.
> > BTW, I picked up R about a month ago (I used primarily SAS, Stata and
> > SPSS).
> >
> > Regards and TIA,
> > Jesse
> >
> >
> >
> >
> >
> >
> > Jesse A. Canchola
> > Biostatistician III
> > Bayer Healthcare
> > 725 Potter St.
> > Berkeley, CA 94710
> > P: 510.705.5855
> > F: 510.705.5718
> > E: Jesse.Canchola.b at Bayer.Com
> >
> >
> >
> >
> >
> 
_______________________________________________________________________________________________
> >
> > The information contained in this e-mail is for the exclusive use of 
the
> intended recipient(s) and may be confidential, proprietary, and/or 
legally
> privileged.  Inadvertent disclosure of this message does not constitute 
a
> waiver of any privilege.  If you receive this message in error, please 
do
> not directly or indirectly use, print, copy, forward, or disclose any 
part
> of this message.  Please also delete this e-mail and all copies and 
notify
> the sender.  Thank you.
> >
> > For alternate languages please go to 
http://bayerdisclaimer.bayerweb.com
> >
> > ______________________________________________
> > 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
> >
>
>
>



More information about the R-help mailing list