[R] inserting rows into a matrix

Robin Hankin r.hankin at noc.soton.ac.uk
Thu Jul 27 16:42:46 CEST 2006


Gabor, Christos

great, two elegant  vectorized  solutions.  I spent quite a long time
trying to generalize my f() to accept zeroes with no luck (long
story), so either of these solutions is fine.



TDH  [this *did* help]

rksh



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

> 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
>
>
>

--
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