[R] Algorithm needed

Marc Schwartz marc_schwartz at comcast.net
Thu Nov 9 23:41:00 CET 2006


On Thu, 2006-11-09 at 16:24 -0600, Marc Schwartz wrote:
> On Thu, 2006-11-09 at 22:32 +0100, Peter Dalgaard wrote:
> > hbeltra at sas.upenn.edu writes:
> > 
> > > I have a matrix of size "n" and I want to create a new one in which the columns
> > > are sums of the original matrix, with some order in the sums.  For example, if
> > > matrix A has 4 columns, then the new matrix should have 6 columns with the
> > > following info from the columns of A: 1+2, 1+3, 1+4, 2+3, 2+4, 3+4. If matrix A
> > > has 5 columns, then the new matrix has 10 columns: 1+2, 1+3, 1+4, 1+5, 2+3, 2+4,
> > > 2+5, 3+4, 3+5, 4+5
> > > 
> > > I thought of using a for loop:
> > > for (i in 1:n-1) {
> > >   for (j in (i+1):n) {
> > >       A[,i] + A[,j]
> > >   }
> > > }
> > > 
> > > but I don't know how to store the results so the new matrix has all the columns.
> > >  I know the number of columns in the new matrix is given by n(n-1)/2.
> > > 
> > > Any ideas?  Thanks.
> > 
> > This should work in 2.4.0
> > 
> > n <- ncol(A)
> > cmb <- combn(n,2)
> > res <- A[,cmb[1,]] + A[,cmb[2,]]
> 
> Peter, 
> 
> May I suggest that there be reciprocal "See Also"s added to ?expand.grid
> and ?combn.
> 
> I had forgotten that this was added to 2.4.0, initially looked at the
> former to begin a solution and then finally decided to propose:
> 
>   do.call("cbind", sapply(2:ncol(A), 
>                    function(x) A[, x - 1] + A[, x:ncol(mat)]))

Speaking of aging neurons, that should be:

 do.call("cbind", sapply(2:ncol(A), 
                  function(x) A[, x - 1] + A[, x:ncol(A)]))

I accidentally left that last 'mat' in there from testing...

Marc



More information about the R-help mailing list