[R] matrix values linked to vector index

arun smartpink111 at yahoo.com
Fri Oct 11 23:30:59 CEST 2013


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 <djmuser at 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 <smartpink111 at 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 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.




More information about the R-help mailing list