Dear all, I am trying to split a matrix into 2 as efficiently as possible. It is a character matrix: 1 2 3 1 "2-271" "2-367" "1-79" 2 "2-282" "2-378" "1-90" 3 "2-281" "2-377" "1-89" I want to make 2 matrices from this, as succinctly and efficiently as possible. I've tried such things as sapply(matrix, strsplit, "-") and tried to go from there, but I can't figure it out! So far I do it with a 2D for loop which can't be efficient! firstPartM <- matrix(ncol= dim(zzz)[2], nrow= dim(zzz)[1]) secondPartM <- matrix(ncol= dim(zzz)[2], nrow= dim(zzz)[1]) for(i in 1:dim(zzz)[1]) { for(j in 1:dim(zzz)[2]) { splitS <- strsplit(zzz[i,j],"-") firstPartM[i,j] <- splitS[[1]][1] secondPartM[i,j] <- splitS[[1]][2] } } Cheers, Jim
one way us the following: mat <- rbind( c("2-271", "2-367", "1-79"), c("2-282", "2-378", "1-90"), c("2-281", "2-377", "1-89") ) sp <- strsplit(c(mat), "-") mat1 <- sapply(sp, "[", 1) mat2 <- sapply(sp, "[", 2) dim(mat1) <- dim(mat2) <- dim(mat) mat1 mat2 I hope it helps. Best, Dimitris James Perkins wrote:> Dear all, > > I am trying to split a matrix into 2 as efficiently as possible. > > It is a character matrix: > > 1 2 3 1 "2-271" "2-367" "1-79" > 2 "2-282" "2-378" "1-90" > 3 "2-281" "2-377" "1-89" > > I want to make 2 matrices from this, as succinctly and efficiently as > possible. > > I've tried such things as sapply(matrix, strsplit, "-") and tried to go > from there, but I can't figure it out! So far I do it with a 2D for loop > which can't be efficient! > > firstPartM <- matrix(ncol= dim(zzz)[2], nrow= dim(zzz)[1]) > secondPartM <- matrix(ncol= dim(zzz)[2], nrow= dim(zzz)[1]) > for(i in 1:dim(zzz)[1]) { > for(j in 1:dim(zzz)[2]) { > splitS <- strsplit(zzz[i,j],"-") > firstPartM[i,j] <- splitS[[1]][1] > secondPartM[i,j] <- splitS[[1]][2] > } > } > > Cheers, > > Jim > > ______________________________________________ > 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. >-- Dimitris Rizopoulos Assistant Professor Department of Biostatistics Erasmus University Medical Center Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands Tel: +31/(0)10/7043478 Fax: +31/(0)10/7043014
Try this: #1 gsub(".*-", "", zzz) #2 gsub("-.*", "", zzz) On Mon, Aug 10, 2009 at 1:56 PM, James Perkins <jperkins@biochem.ucl.ac.uk>wrote:> Dear all, > > I am trying to split a matrix into 2 as efficiently as possible. > > It is a character matrix: > > 1 2 3 1 "2-271" "2-367" "1-79" > 2 "2-282" "2-378" "1-90" > 3 "2-281" "2-377" "1-89" > > I want to make 2 matrices from this, as succinctly and efficiently as > possible. > > I've tried such things as sapply(matrix, strsplit, "-") and tried to go > from there, but I can't figure it out! So far I do it with a 2D for loop > which can't be efficient! > > firstPartM <- matrix(ncol= dim(zzz)[2], nrow= dim(zzz)[1]) > secondPartM <- matrix(ncol= dim(zzz)[2], nrow= dim(zzz)[1]) > for(i in 1:dim(zzz)[1]) { > for(j in 1:dim(zzz)[2]) { > splitS <- strsplit(zzz[i,j],"-") > firstPartM[i,j] <- splitS[[1]][1] > secondPartM[i,j] <- splitS[[1]][2] > } > } > > Cheers, > > Jim > > ______________________________________________ > R-help@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. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]