> 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 [EMAIL PROTECTED]
______________________________________________
[EMAIL PROTECTED] 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
______________________________________________ [EMAIL PROTECTED] 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