Federico Calboli
2011-Jul-12 13:07 UTC
[R] applying function to multiple columns of a matrix
Hi, I want to apply a function to a matrix, taking the columns 3 by 3. I could use a for loop: for(i in 1:3){ # here I assume my data matrix has 9 columns j = i*3 set = my.data[,c(j-2,j-1,j)] my.function(set) } which looks cumbersome and possibly slow. I was hoping there is some function in the apply()/lapply() families that could take 3 columns at a time. I though of turning mydata in a list, then using lapply() new.data = list(my.data[,1:3], my.data[,4:6], my.data[,7:9]) lapply(new.data, my.function) but that might incur in too much memory penalty and does have the issue of requiring a for loop to create the list (not all my data is conveniently of 9 columns only). Any suggestion would be much appreciated. Bw Federico -- Federico C. F. Calboli Department of Epidemiology and Biostatistics Imperial College, St. Mary's Campus Norfolk Place, London W2 1PG Tel +44 (0)20 75941602 Fax +44 (0)20 75943193 f.calboli [.a.t] imperial.ac.uk f.calboli [.a.t] gmail.com
Filipe Leme Botelho
2011-Jul-12 13:44 UTC
[R] RES: applying function to multiple columns of a matrix
Hi Frederico. I would keep the data as it is, create two small vectors referring to the ranges and use a mapply (as a sapply but with multiple variables) for the function. Hope the example below is helpful, although as usual someone out there will have a better solution for it.> dta <- c() > for (i in 1:12) dta <- cbind(dta,matrix(i,5,1)) > dta[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [1,] 1 2 3 4 5 6 7 8 9 10 11 12 [2,] 1 2 3 4 5 6 7 8 9 10 11 12 [3,] 1 2 3 4 5 6 7 8 9 10 11 12 [4,] 1 2 3 4 5 6 7 8 9 10 11 12 [5,] 1 2 3 4 5 6 7 8 9 10 11 12> > > rng.a <- seq(1,10,by=3) > rng.b <- seq(3,12,by=3) > rng.a[1] 1 4 7 10> rng.b[1] 3 6 9 12> mapply(x=rng.a, y=rng.b, function(x,y) sum(dta[,c(x:y)]))[1] 30 75 120 165>Cheers, Filipe -----Mensagem original----- De: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] Em nome de Federico Calboli Enviada em: ter?a-feira, 12 de julho de 2011 10:07 Para: r-help Assunto: [R] applying function to multiple columns of a matrix Hi, I want to apply a function to a matrix, taking the columns 3 by 3. I could use a for loop: for(i in 1:3){ # here I assume my data matrix has 9 columns j = i*3 set = my.data[,c(j-2,j-1,j)] my.function(set) } which looks cumbersome and possibly slow. I was hoping there is some function in the apply()/lapply() families that could take 3 columns at a time. I though of turning mydata in a list, then using lapply() new.data = list(my.data[,1:3], my.data[,4:6], my.data[,7:9]) lapply(new.data, my.function) but that might incur in too much memory penalty and does have the issue of requiring a for loop to create the list (not all my data is conveniently of 9 columns only). Any suggestion would be much appreciated. Bw Federico -- Federico C. F. Calboli Department of Epidemiology and Biostatistics Imperial College, St. Mary's Campus Norfolk Place, London W2 1PG Tel +44 (0)20 75941602 Fax +44 (0)20 75943193 f.calboli [.a.t] imperial.ac.uk f.calboli [.a.t] gmail.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. "This message and its attachments may contain confidential and/or privileged information. If you are not the addressee, please, advise the sender immediately by replying to the e-mail and delete this message." "Este mensaje y sus anexos pueden contener informaci?n confidencial o privilegiada. Si ha recibido este e-mail por error por favor b?rrelo y env?e un mensaje al remitente." "Esta mensagem e seus anexos podem conter informa??o confidencial ou privilegiada. Caso n?o seja o destinat?rio, solicitamos a imediata notifica??o ao remetente e exclus?o da mensagem."