Okay, this one is hard to put into words:> x <- 1:9; names(x) <- x > y <- x %o% x > y1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81> my.foo( a, b ) { c <- a - b; #really more complex, but just to illustrate > }--------------------------------------------------------------------- What I would like to do is apply my.foo() which takes two columns, a and b, does an operation and returns another column c. The columns I want to feed into my.foo() are all the combinations of columns in y. So I want to apply my.foo( y[,1], y[,1] ) and then my.foo( y[,1], y[,2] ), etc... for all combinations() of the 10 columns in y. I would expect the final output to be 10x10x10. Passing 10 columns by 10 columns to my.foo() which outputs a vector of 10 numbers at a time. ***So in essence, what I am trying to accomplish is like outer(), but instead of operating on atomic values, I want to operate on columns of y. I know I can use loops to accomplish this, but I would like to code as R-like as possible. I am learning a great deal about "how to think in R" from the excellent replies on this board. Thanks in advance for any suggestions. -- View this message in context: http://www.nabble.com/Doing--o--that-operates-on-columns-instead-of-atomics-tp22701363p22701363.html Sent from the R help mailing list archive at Nabble.com.
CORRECTION:> my.foo <- function( a, b ) { c <- a - b; } #really more complex, but just > to illustrate-- View this message in context: http://www.nabble.com/Doing--o--that-operates-on-columns-instead-of-atomics-tp22701363p22701400.html Sent from the R help mailing list archive at Nabble.com.
Stavros Macrakis
2009-Mar-25 14:25 UTC
[R] Doing %o% that operates on columns instead of atomics
Maybe something like the code below? There is surely a more elegant way of handling the indices, maybe with plyr? -s> xx <- array(1:6,c(3,2)); xx[,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6> yy <- array(1:12,c(3,4)); yy[,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12> array(sapply(1:ncol(xx), function(i) sapply(1:ncol(yy), function(j) xx[,i]*yy[,j])), c(nrow(xx),ncol(xx),ncol(yy)) ) , , 1 [,1] [,2] [1,] 1 4 [2,] 4 10 [3,] 9 18 , , 2 [,1] [,2] [1,] 7 10 [2,] 16 22 [3,] 27 36 , , 3 [,1] [,2] [1,] 4 16 [2,] 10 25 [3,] 18 36 , , 4 [,1] [,2] [1,] 28 40 [2,] 40 55 [3,] 54 72> xx[,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6>
jim holtman
2009-Mar-25 15:12 UTC
[R] Doing %o% that operates on columns instead of atomics
Is this what you want: > my.foo <- function( a, b ) a - b> z <- combn(ncol(y), 2) # get all the combinations of 2 columns > result <- do.call(cbind, lapply(seq(ncol(z)), function(.cols){+ my.foo(y[,z[1,.cols]], y[, z[2, .cols]]) + }))> > > result[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] 1 -1 -2 -3 -4 -5 -6 -7 -8 -1 -2 -3 -4 -5 -6 -7 -1 -2 -3 -4 -5 -6 -1 -2 -3 -4 -5 2 -2 -4 -6 -8 -10 -12 -14 -16 -2 -4 -6 -8 -10 -12 -14 -2 -4 -6 -8 -10 -12 -2 -4 -6 -8 -10 3 -3 -6 -9 -12 -15 -18 -21 -24 -3 -6 -9 -12 -15 -18 -21 -3 -6 -9 -12 -15 -18 -3 -6 -9 -12 -15 4 -4 -8 -12 -16 -20 -24 -28 -32 -4 -8 -12 -16 -20 -24 -28 -4 -8 -12 -16 -20 -24 -4 -8 -12 -16 -20 5 -5 -10 -15 -20 -25 -30 -35 -40 -5 -10 -15 -20 -25 -30 -35 -5 -10 -15 -20 -25 -30 -5 -10 -15 -20 -25 6 -6 -12 -18 -24 -30 -36 -42 -48 -6 -12 -18 -24 -30 -36 -42 -6 -12 -18 -24 -30 -36 -6 -12 -18 -24 -30 7 -7 -14 -21 -28 -35 -42 -49 -56 -7 -14 -21 -28 -35 -42 -49 -7 -14 -21 -28 -35 -42 -7 -14 -21 -28 -35 8 -8 -16 -24 -32 -40 -48 -56 -64 -8 -16 -24 -32 -40 -48 -56 -8 -16 -24 -32 -40 -48 -8 -16 -24 -32 -40 9 -9 -18 -27 -36 -45 -54 -63 -72 -9 -18 -27 -36 -45 -54 -63 -9 -18 -27 -36 -45 -54 -9 -18 -27 -36 -45 [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] 1 -1 -2 -3 -4 -1 -2 -3 -1 -2 -1 2 -2 -4 -6 -8 -2 -4 -6 -2 -4 -2 3 -3 -6 -9 -12 -3 -6 -9 -3 -6 -3 4 -4 -8 -12 -16 -4 -8 -12 -4 -8 -4 5 -5 -10 -15 -20 -5 -10 -15 -5 -10 -5 6 -6 -12 -18 -24 -6 -12 -18 -6 -12 -6 7 -7 -14 -21 -28 -7 -14 -21 -7 -14 -7 8 -8 -16 -24 -32 -8 -16 -24 -8 -16 -8 9 -9 -18 -27 -36 -9 -18 -27 -9 -18 -9> > y1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81>On Wed, Mar 25, 2009 at 9:03 AM, Ken-JP <kfmfe04 at gmail.com> wrote:> > Okay, this one is hard to put into words: > >> x <- 1:9; names(x) <- x >> y <- x %o% x >> y > > ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 > 1 1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 > 2 2 ?4 ?6 ?8 10 12 14 16 18 > 3 3 ?6 ?9 12 15 18 21 24 27 > 4 4 ?8 12 16 20 24 28 32 36 > 5 5 10 15 20 25 30 35 40 45 > 6 6 12 18 24 30 36 42 48 54 > 7 7 14 21 28 35 42 49 56 63 > 8 8 16 24 32 40 48 56 64 72 > 9 9 18 27 36 45 54 63 72 81 > >> my.foo( a, b ) { c <- a - b; #really more complex, but just to illustrate >> } > > --------------------------------------------------------------------- > > What I would like to do is apply my.foo() which takes two columns, a and b, > does an operation and returns another column c. ?The columns I want to feed > into my.foo() are all the combinations of columns in y. ?So I want to apply > my.foo( y[,1], y[,1] ) and then my.foo( y[,1], y[,2] ), etc... ?for all > combinations() of the 10 columns in y. > > I would expect the final output to be 10x10x10. ?Passing 10 columns by 10 > columns to my.foo() which outputs a vector of 10 numbers at a time. > > ***So in essence, what I am trying to accomplish is like outer(), but > instead of operating on atomic values, I want to operate on columns of y. > > I know I can use loops to accomplish this, but I would like to code as > R-like as possible. ?I am learning a great deal about "how to think in R" > from the excellent replies on this board. > > Thanks in advance for any suggestions. > > > > -- > View this message in context: http://www.nabble.com/Doing--o--that-operates-on-columns-instead-of-atomics-tp22701363p22701363.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > 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?