Re: [R] looping using combinatorics

From: Jesse Albert Canchola <jesse.canchola.b_at_bayer.com>
Date: Sat 15 Jul 2006 - 03:49:25 EST


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@gmail.com> 07/13/2006 07:39 PM

To
"Jesse Albert Canchola" <jesse.canchola.b@bayer.com> cc
r-help@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@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@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@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
>


R-help@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 Received on Sat Jul 15 05:02:53 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Sat 15 Jul 2006 - 06:17:01 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.