Or, you can modify Romain's function to account for sequential NAs.

x <- c(1,2,NA,1,1,2,NA,NA,4,5,2,3)
foo <- function( x ){
   idx <- 1 + cumsum( is.na( x ) )
   not.na <- ! is.na( x )

   f<-factor(idx[not.na],levels=1:max(idx))

   split( x[not.na], f )
 }

$`1`
[1] 1 2

$`2`
[1] 1 1 2

$`3`
numeric(0)

$`4`
[1] 4 5 2 3

-tgs

On Thu, Apr 29, 2010 at 4:00 AM, Tal Galili <tal.gal...@gmail.com> wrote:

> Definitely Smarter,
> Thanks!
>
> Tal
>
> ----------------Contact
> Details:-------------------------------------------------------
> Contact me: tal.gal...@gmail.com |  972-52-7275845
> Read me: www.talgalili.com (Hebrew) | www.biostatistics.co.il (Hebrew) |
> www.r-statistics.com (English)
>
> ----------------------------------------------------------------------------------------------
>
>
>
>
> On Thu, Apr 29, 2010 at 10:56 AM, Romain Francois <
> romain.franc...@dbmail.com> wrote:
>
> > Maybe this :
> >
> > > foo <- function( x ){
> > +   idx <- 1 + cumsum( is.na( x ) )
> > +   not.na <- ! is.na( x )
> > +   split( x[not.na], idx[not.na] )
> > + }
> > > foo( x )
> >
> > $`1`
> > [1] 2 1 2
> >
> > $`2`
> > [1] 1 1 2
> >
> > $`3`
> > [1] 4 5 2 3
> >
> > Romain
> >
> > Le 29/04/10 09:42, Tal Galili a écrit :
> >
> >
> >> Hi all,
> >>
> >> I would like to have a function like this:
> >> split.vec.by.NA<- function(x)
> >>
> >> That takes a vector like this:
> >> x<- c(2,1,2,NA,1,1,2,NA,4,5,2,3)
> >>
> >> And returns a list of length of 3, each element of the list is the
> >> relevant
> >> segmented vector, like this:
> >>
> >> $`1`
> >> [1] 2 1 2
> >> $`2`
> >> [1] 1 1 2
> >> $`3`
> >> [1] 4 5 2 3
> >>
> >>
> >> I found how to do it with a loop, but wondered if there is some smarter
> >> (vectorized) way of doing it.
> >>
> >>
> >>
> >> Here is the code I used:
> >>
> >> x<- c(2,1,2,NA,1,1,2,NA,4,5,2,3)
> >>
> >>
> >> split.vec.by.NA<- function(x)
> >> {
> >> # assumes NA are seperating groups of numbers
> >> #TODO: add code to check for it
> >>
> >> number.of.groups<- sum(is.na(x)) + 1
> >> groups.end.point.locations<- c(which(is.na(x)), length(x)+1) # This
> will
> >> be
> >> all the places with NA's + a nubmer after the ending of the vector
> >>  group.start<- 1
> >> group.end<- NA
> >> new.groups.split.id<- x # we will replace all the places of the group
> >> with
> >> group ID, excapt for the NA, which will later be replaced by 0
> >>  for(i in seq_len(number.of.groups))
> >> {
> >> group.end<- groups.end.point.locations[i]-1
> >>  new.groups.split.id[group.start:group.end]<- i
> >>  group.start<- groups.end.point.locations[i]+1 # make the new group
> start
> >> higher for the next loop (at the final loop it won't matter
> >>  }
> >>  new.groups.split.id[is.na(x)]<- 0
> >>  return(split(x, new.groups.split.id)[-1])
> >> }
> >>
> >> split.vec.by.NA(x)
> >>
> >>
> >>
> >>
> >> Thanks,
> >> Tal
> >>
> >
> > --
> > Romain Francois
> > Professional R Enthusiast
> > +33(0) 6 28 91 30 30
> > http://romainfrancois.blog.free.fr
> > |- http://bit.ly/9aKDM9 : embed images in Rd documents
> > |- http://tr.im/OIXN : raster images and RImageJ
> > |- http://tr.im/OcQe : Rcpp 0.7.7
> >
> >
> >
>
>         [[alternative HTML version deleted]]
>
>
> ______________________________________________
> 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.
>
>

        [[alternative HTML version deleted]]

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

Reply via email to