[R] expanding some values in logical vector
Petr Pikal
petr.pikal at precheza.cz
Mon Mar 15 15:40:27 CET 2004
Thank you very much. I myself thought about something similar but I was not so
smart to use outer.
Cheers
Petr
On 15 Mar 2004 at 13:51, Peter Wolf wrote:
> Try:
>
> > x<-rep(FALSE,20); x[c(4,10,15)]<-TRUE
> > x
> [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
> FALSE
> [13] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
> > x[outer(which(x),-1:1,"+")]<-T
> > x
> [1] FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
> FALSE
> [13] FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
> > x<-rep(FALSE,20); x[c(4,10,15)]<-TRUE
> > x[outer(which(x),-2:2,"+")]<-T
> > x
> [1] FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
> TRUE
> [13] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
> # now we definie
> > expand.true<-function(x,span=1){
> m<-floor(span/2)
> ind<-outer(which(x),(-m):m,"+")
> ind<-ind[ind>0 & ind <= length(x)]
> x[ind]<-TRUE
> x
> }
> > x<-rep(FALSE,20); x[c(4,10,19)]<-TRUE
> > expand.true(x,span=5)
> [1] FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
> TRUE
> [13] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
>
>
>
> Peter Wolf
>
>
> Petr Pikal wrote:
>
> >Dear all
> >
> >In automatic dropout evaluation function I construct an index
> >(pointer), which will be TRUE at "unusual" values. Then I need to
> >expand these TRUE values a little bit forward and backward.
> >
> >Example:
> >
> >having span=5, from vector
> >
> >idx<-rep(F,10)
> >idx[4]<-T
> >
> >
> >
> >>idx
> >>
> >>
> > [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
> >FALSE
> >
> >I need
> >
> >
> >
> >>idx
> >>
> >>
> > [1] FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
> >FALSE
> >
> >
> >I was using embed() for this task (myfun1):
> >
> >idx <- rep(F,20)
> >idx[c(4,11,13)] <- T
> >
> >
> >
> >>idx
> >>
> >>
> > [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
> >FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
> >FALSE
> >
> >iii <- myfun1(idx)
> >
> >
> >
> >>iii
> >>
> >>
> > [1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
> >TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
> >FALSE
> >
> >
> >It is close to what I want, but it is slow and when idx vector is
> >long enough it goes short of memory. Then I tried to accomplish it
> >with rle() and some fiddling with $values and $lengths (myfun2),
> >which works as long as the true values are completely separated.
> >
> >idx <- rep(F,20)
> >idx[c(4,12)] <- T
> >
> >
> >
> >>idx
> >>
> >>
> > [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
> >FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> >FALSE
> >
> >iii <- myfun2(idx)
> >
> >
> >>iii
> >>
> >>
> > [1] FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
> >TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
> >FALSE
> >
> >But when using previous idx
> >
> >idx <- rep(F,20)
> >idx[c(4,11,13)] <- T
> >
> >iii <- myfun2(idx)
> >Error in rep.default(kody$values, opak) : invalid number of copies in
> >"rep"
> >
> >Problem is, if TRUE values are closer than span allows. Then some
> >values in "opak" for FALSE kody$values are negative, what is not
> >allowed. Setting them to zero will expand the length of index vector.
> >Instead number of repetitions of neighbour TRUE values should be
> >decreased accordingly.
> >
> >I greatly appreciated, if somebody could give me a hint if there is
> >some another built in function which can help me or what to do with
> >myfun2 or how to get properly expanded index values by some another
> >way.
> >
> >Sorry for the long post but I was not able to explain my problem and
> >what I have done yet to solve it in shorter.
> >
> >Thank you and best regards.
> >
> >Petr Pikal
> >
> >
> >
> >
> >##### Here are functions used #####
> >
> >
> >
> >myfun1 <- function(idx,span=5)
> >
> >{
> >n <- length(idx)
> >s <- span%/%2
> >z <- embed(idx,span)
> >sumy <- rowSums(z)>0
> >index <- c(rep(sumy[1],s),sumy,rep(sumy[n-span+1],s))
> >}
> >
> >
> >
> >myfun2 <- function(idx,span=5)
> >
> >{
> >n <- length(idx)
> >
> >kody <- rle(idx)
> >test <- letters[sum(cumsum(c(kody$values[1],idx[n])))+1] ####is some
> >of true values at the end of vector idx? opak <-
> >kody$values*(span-1)*2-(span-1)+kody$lengths #### enlarge number of
> >TRUE repetitions according to the span delka <- length(opak)
> >
> >#### some ifs to ensure the end points will have correct number of
> >#### repetitions
> >
> >opak[c(1,delka)] <- opak[c(1,delka)]+span%/%2
> >if (sum(kody$values)==0) opak <- n
> >if (opak[1]<0) {opak[2] <- opak[2]+opak[1]; opak[1] <- 0}
> >if (opak[delka]<0) {opak[delka-1] <- opak[delka-1]+opak[delka];
> >opak[delka] <- 0}
> >
> >switch(test,
> >
> >a = opak<-opak,
> >b = opak[delka]<-opak[delka]-(span-1),
> >c = opak[1]<-opak[1]-(span-1),
> >d = opak[c(1,delka)]<-opak[c(1,delka)]-(span-1),
> >
> >)
> >
> >#### here should opak contain correct number of repetitions but does
> >#### not
> >
> >index<-rep(kody$values,opak)
> >
> >}
> >Petr Pikal
> >petr.pikal at precheza.cz
> >
> >______________________________________________
> >R-help at stat.math.ethz.ch mailing list
> >https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> >PLEASE do read the posting guide!
> >http://www.R-project.org/posting-guide.html
> >
> >
>
>
>
Petr Pikal
petr.pikal at precheza.cz
More information about the R-help
mailing list