[R] inserting rows into a matrix

Christos Hatzis christos at nuverabio.com
Thu Jul 27 16:34:52 CEST 2006


Hi Robin,

Ok.  I see.  Try this then:

f <- function(a){if( any(a==0) ) stop("Zeros in input vector") else
cbind(a,a+1,rev(a))}
a2 <- c(1,0,0,2,4,0,3)

f(a2) # error message

f2 <- function(a) {
    indx.zero <- which(a==0)
    indx.nz <- (1:length(a))[-indx.zero]
    
    x <- f(a[indx.nz])
    xx <- matrix(NA,length(a),ncol(x))
    xx[ indx.zero, ] <- rep(0,ncol(x))
    xx[ indx.nz, ] <- x
    xx
}

> f2(a2)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    0    0    0
[3,]    0    0    0
[4,]    2    3    4
[5,]    4    5    2
[6,]    0    0    0
[7,]    3    4    1

-Christos

-----Original Message-----
From: Robin Hankin [mailto:r.hankin at noc.soton.ac.uk] 
Sent: Thursday, July 27, 2006 10:16 AM
To: christos at nuverabio.com
Cc: 'Robin Hankin'; 'RHelp'
Subject: Re: [R] inserting rows into a matrix

Hi Christos

thanks for this, but it won't work because in my application
f(A2) will fail if there are any zeroes in A2.


cheers

rksh


On 27 Jul 2006, at 15:10, Christos Hatzis wrote:

> This is not as elegant, but should work:
>
> a3 <- f(A2)
> a3[ which( apply(a3,1,prod) == 0 ), ] <- rep(0,ncol(a3))
> a3
>
> Essentially use the product to pick out the rows with at least one 0 
> and replace these rows with 0s.
>
> HTH.
> -Christos
>
> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch 
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Robin Hankin
> Sent: Thursday, July 27, 2006 9:54 AM
> To: RHelp
> Subject: [R] inserting rows into a matrix
>
> Hi
>
>
> I have a little vector function that takes a vector A of strictly 
> positive integers and outputs a matrix M  each of whose columns is the 
> vector, modified in a complicated combinatorical way.
>
> Now I want to generalize the function so that A can include zeroes.
> Given A,
> I want to strip out the zeroes, pass it to my function, and pad  M
>   with rows at positions corresponding to the zeroes of A.
>
> Commented, minimal, self-contained, reproducible toy example follows.
>
>
> f <- function(a){cbind(a,a+1,rev(a))}  #real function a ghastly 
> nightmare
>
>   A <- 1:5
>   f(A)
>       a
> [1,] 1 2 5
> [2,] 2 3 4
> [3,] 3 4 3
> [4,] 4 5 2
> [5,] 5 6 1
>
>
> # f() works as desired.
>
> # Now introduce A2, that includes zeroes.  In my application, f(A2) 
> would fail because of the zeroes.
>
> A2 <- c(1,0,0,2,4,0,3)
>
> I can strip the zeroes out and call f():
>   f(A2[A2>0])
>       a
> [1,] 1 2 3
> [2,] 2 3 4
> [3,] 4 5 2
> [4,] 3 4 1
>
> which is fine.  How to put the zeroes back in in the appropriate rows 
> and get the following:
>
>> cbind(c(1,0,0,2,4,0,3),c(2,0,0,3,5,0,4),c(3,0,0,4,2,0,1))
>       [,1] [,2] [,3]
> [1,]    1    2    3
> [2,]    0    0    0
> [3,]    0    0    0
> [4,]    2    3    4
> [5,]    4    5    2
> [6,]    0    0    0
> [7,]    3    4    1
>>
>
>
>
> anyone?
>
>
>
> --
> Robin Hankin
> Uncertainty Analyst
> National Oceanography Centre, Southampton European Way, Southampton
> SO14
> 3ZH, UK
>   tel  023-8059-7743
>
> ______________________________________________
> R-help at 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.
>
>

--
Robin Hankin
Uncertainty Analyst
National Oceanography Centre, Southampton European Way, Southampton SO14
3ZH, UK
  tel  023-8059-7743



More information about the R-help mailing list