On Tue, 2007-07-31 at 10:35 -0700, yuvika wrote: > Hello all, > > I have a matrix whose column names look like > > a1 a2 b1 b2 b3 c1 c2 > 1 2 3 7 1 3 2 > 4 6 7 8 1 4 3 > > Now, I can have any number of a's. not just two as shown above and > same goes for b's and c's. I need to extract all the a's columns and > put them in another matrix, extract all b's columns and put them in > some matrix and same goes for "c". How can I identify such pattern and > get subsets of this matrix depending on columns names? > > I will appreciate a quick reply. > Thanks a lot.
If 'MAT' is your matrix: > MAT a1 a2 b1 b2 b3 c1 c2 [1,] 1 2 3 7 1 3 2 [2,] 4 6 7 8 1 4 3 You can use: > sapply(letters[1:3], function(x) MAT[, grep(x, colnames(MAT))]) $a a1 a2 [1,] 1 2 [2,] 4 6 $b b1 b2 b3 [1,] 3 7 1 [2,] 7 8 1 $c c1 c2 [1,] 3 2 [2,] 4 3 which returns a list containing the three matrices as a consequence of subsetting 'MAT" based upon the colnames. This uses sapply() to loop over letters[1:3], which is: > letters[1:3] [1] "a" "b" "c" and then uses grep() to get the indices of the colnames matching the individual letters, passed as 'x' in each iteration of the sapply() loop. For example: > grep("a", colnames(MAT)) [1] 1 2 You can then manipulate each sub-matrix in the list as you require. See ?sapply, ?grep and ?letters HTH, Marc Schwartz ______________________________________________ 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 and provide commented, minimal, self-contained, reproducible code.