Thanks Dennis. I noticed I didn't take the "0" value into consideration and also didn't check the unsorted vector.vec1<- c(2,4,1)
is.numeric(vec1) #[1] TRUE makeMat(as.integer(vec1)) makeMatrix2<- function(x){ if(is.numeric(x)){ x <- as.integer(round(x)) x} stopifnot(is.integer(x)) m1<- matrix(0,length(x),max(x)) indx <- cbind(rep(seq_along(x),x),seq_len(sum(x))-rep(cumsum(c(0L,x[-length(x)])),x)) m1[indx]<- 1 m1} identical(makeMat(x1),makeMatrix2(x1)) #[1] TRUE identical(makeMat(x2),makeMatrix2(x2)) #[1] TRUE identical(makeMat(x3),makeMatrix2(x3)) #Error: is.integer(x) is not TRUE makeMatrix2(x3) # [,1] [,2] #[1,] 1 1 #[2,] 1 0 #[3,] 1 1 identical(makeMat(4:6),makeMatrix2(4:6)) #[1] TRUE x4 <- c("a",1,3) identical(makeMat(x4),makeMatrix2(x4)) #Error: is.integer(x) is not TRUE A.K. On Friday, October 11, 2013 4:41 PM, Dennis Murphy <djmu...@gmail.com> wrote: Attempting to follow the OP's conditions and assuming I understood them correctly, here is one way to wrap this up into a function: makeMat <- function(x) { stopifnot(is.integer(x)) nr <- length(x) nc <- max(x) # Initialize a matrix of zeros m <- matrix(0, nr, nc) # Conditionally replace with ones for(i in seq_len(nr)) if(x[i] != 0) m[i, 1:x[i]] <- 1 m } ## Examples: x1 <- 1:3 x2 <- as.integer(c(2, 0, 4, 3, 1)) x3 <- c(2, 1, 2.2) makeMat(x1) makeMat(x2) makeMat(x3) makeMat(4:6) On Fri, Oct 11, 2013 at 9:49 AM, arun <smartpink...@yahoo.com> wrote: > Hi, > > In the example you showed: > > m1<- matrix(0,length(vec),max(vec)) > 1*!upper.tri(m1) > > #or > m1[!upper.tri(m1)] <- rep(rep(1,length(vec)),vec) > > #But, in a case like below, perhaps: > vec1<- c(3,4,5) > > m2<- matrix(0,length(vec1),max(vec1)) > indx <- >cbind(rep(seq_along(vec1),vec1),unlist(tapply(vec1,list(vec1),FUN=seq),use.names=FALSE)) > m2[indx]<- 1 > m2 > # [,1] [,2] [,3] [,4] [,5] > #[1,] 1 1 1 0 0 > #[2,] 1 1 1 1 0 > #[3,] 1 1 1 1 1 > > > > > A.K. > > > Hi- > > I'd like to create a matrix of 0's and 1's where the number of > 1's in each row defined by the value indexed in another vector, and > where the (value-1) is back-filled by 0's. > > For example, given the following vector: > vec= c(1,2,3) > > I'd like to produce a matrix with dimensions (length(vec), max(vec)): > > 1,0,0 > 1,1,0 > 1,1,1 > > Thank you! > > ______________________________________________ > 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. ______________________________________________ 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.