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. Hiram
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,]] -- O__ ---- Peter Dalgaard ?ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
On 09-Nov-06 hbeltra at sas.upenn.edu wrote:> 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. > > HiramWhat an intriguing little question! The natural place to look for all the combinations of 2 out of n (in the order you require) is the function combn() in the package "combinat". Then I noticed the argument "fun" in "?combn", which led to the following (using a simple example): library(combinat) A<-cbind(c(1,2,3,4),c(1,3,5,7),c(1,4,7,10),c(1,5,9,13)) A # [,1] [,2] [,3] [,4] # [1,] 1 1 1 1 # [2,] 2 3 4 5 # [3,] 3 5 7 9 # [4,] 4 7 10 13 summit<-function(y)(rowSums(A[,y])) S<-combn((1:4),2,fun=summit) S # [,1] [,2] [,3] [,4] [,5] [,6] # [1,] 2 2 2 2 2 2 # [2,] 5 6 7 7 8 9 # [3,] 8 10 12 12 14 16 # [4,] 11 14 17 17 20 23 so it looks as though this will do exactly what you want! Thanks for asking the question: I hadn't spotted this very useful feature of combn() before. Best wishes, Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <Ted.Harding at nessie.mcc.ac.uk> Fax-to-email: +44 (0)870 094 0861 Date: 09-Nov-06 Time: 22:36:38 ------------------------------ XFMail ------------------------------
Apparently Analagous Threads
- aggregate combination data
- Please help R error message "masked from 'package:utils':combn"
- Importing function that is previously imported by other package
- Non repetitive permutations/combinations of elements
- Copying rows from a matrix using a vector of indices