# Re: [R] inserting rows into a matrix

From: Christos Hatzis <christos_at_nuverabio.com>
Date: Fri 28 Jul 2006 - 00:34:52 EST

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@noc.soton.ac.uk] Sent: Thursday, July 27, 2006 10:16 AM
To: christos@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@stat.math.ethz.ch
> [mailto:r-help-bounces@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@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> 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

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help