Petr Pikal
2003-Feb-21 14:36 UTC
[R] how to chage values in data frame to NA iside a function
Dear all I have a function in which I would like to change some values to NA according to some condition. dropout<-function(y, nahr=FALSE,...) { <some stuff for computing an index> if (nahr) y[index]<<-NA invisible(index) } in case y is a vector all works OK but if it is a part of data frame by calling dropout(df$y) or dropout(df[,number]) no change is done. Please can you help me what is wrong with my code? By the way idx<-dropout(df$y) df$y[idx]<-NA works OK Thanks a lot beforehand Best regards. Petr Pikal Precheza a.s., Nab?.Dr.E.Bene?e 24, 750 62 P?erov tel: +420581 252 257 ; 724 008 364 petr.pikal at precheza.cz; p.pik at volny.cz fax +420581 252 561
Thomas W Blackwell
2003-Feb-21 15:04 UTC
[R] how to chage values in data frame to NA iside a function
Petr - Does your function return "index" or return "y" after modifying y ? In the email, it looks as though it returns "index". If so, the following should work:> df$y[ dropout(df$y) ] <- NA- tom blackwell - u michigan medical school - ann arbor - On Fri, 21 Feb 2003, Petr Pikal wrote:> Dear all > > I have a function in which I would like to change some values to NA according to > some condition. > > dropout<-function(y, nahr=FALSE,...) { > > <some stuff for computing an index> > > if (nahr) y[index]<<-NA > invisible(index) > > } > > in case y is a vector all works OK but if it is a part of data frame by calling > > dropout(df$y) or dropout(df[,number]) no change is done. > > Please can you help me what is wrong with my code? > > By the way > > idx<-dropout(df$y) > df$y[idx]<-NA > > works OK > > Thanks a lot beforehand > > Best regards. > > Petr Pikal > Precheza a.s., Nabø.Dr.E.BeneÜe 24, 750 62 Pøerov > tel: +420581 252 257 ; 724 008 364 > petr.pikal at precheza.cz; p.pik at volny.cz > fax +420581 252 561 > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > stat.math.ethz.ch/mailman/listinfo/r-help >
Petr Pikal
2003-Feb-25 08:13 UTC
[R] how to chage values in data frame to NA iside a function
Thank you for your answers. It works OK but my real question is why my function behaves differently used on vector and data frame (or matrix or list). I attached a full version below with some foo data, but basically the function returns the correct index if applied correctly on any type (list, data frame, matrix, vector) but it changes values of operand only if operand is a vector. Why please? On 21 Feb 2003 at 10:23, Spencer Graves wrote:> Thomas Blackwell's solution will also work if dropout(df$y) returns a > logical vector of length = length(df$y). This also allows more > general conditions, e.g., > > select1 <- df[,1] > 0 > select2 <- (select1) & (dr[,2] > 0) > > df[select2, "y"] <- NA > > Spencer Graves > > Thomas W Blackwell wrote: > > Petr - > > > > Does your function return "index" or return "y" after modifying y ? > > In the email, it looks as though it returns "index". If so, the > > following should work: > > > > > >>df$y[ dropout(df$y) ] <- NA > > > > > > - tom blackwell - u michigan medical school - ann arbor - > > > > > > > > On Fri, 21 Feb 2003, Petr Pikal wrote: > > > > > >>Dear all > >> > >>I have a function in which I would like to change some values to NA > >>according to some condition. > >> > >>dropout<-function(y, nahr=FALSE,...) { > >> > >><some stuff for computing an index> > >> > >>if (nahr) y[index]<<-NA > >>invisible(index) > >> > >>} > >> > >>in case y is a vector all works OK but if it is a part of data frame > >>by calling > >> > >>dropout(df$y) or dropout(df[,number]) no change is done. > >> > >>Please can you help me what is wrong with my code? > >> > >>By the way > >> > >>idx<-dropout(df$y) > >>df$y[idx]<-NA > >> > >>works OK > >> > >>Thanks a lot beforehand > >> > >>Best regards. > >> > >>Petr Pikal#foo data x<-seq(0,100,.1) y<-sin(x)+rnorm(length(x),mean=0,sd=1) y1<-y-c(rep(0,200),exp(x[20:50]),rep(0,770)) y<-y1+50 y<-y*(y>0) y[600:700]<-0 df<-data.frame(y) mat<-as.matrix(df) mylist<-as.list(df) #vector plot(x,y) ddd<-dropout(y) points(x[ddd],y[ddd],col=2) ddd<-dropout(y,nahr=T) plot(x,y) rm(ddd) #data frame plot(x,df$y) ddd<-dropout(df$y) points(x[ddd],df$y[ddd],col=2) ddd<-dropout(df$y,nahr=T) plot(x,df$y) rm(ddd) #matrix plot(x,mat[,1]) ddd<-dropout(mat[,1]) points(x[ddd],mat[ddd,1],col=2) ddd<-dropout(mat[,1],nahr=T) plot(x,mat[,1]) rm(ddd) #list plot(x,mylist$y) ddd<-dropout(df$y) points(x[ddd],mylist$y[ddd],col=2) ddd<-dropout(mylist$y,nahr=T) plot(x,mylist$y) #this is full function dropout<-function(y,span=21, mez=NULL, p=0.99995, nahradit=FALSE, ...) { ### this part is just computing the logical index vector with length = length(y) ### and TRUE values where dropout occurs #kontrola licheho spanu if(span/2-span%/%2<.4|span<2) span<- ceiling(span+floor(1/span)+.1) n<-length(y) s<-span%/%2 idx1<-y==0 prumer<-median(y[!idx1],na.rm=T) if (is.null(mez)) { mez<-mad(y[!idx1],na.rm=T) dm<-prumer-mez*qnorm(p) hm<-prumer+mez*qnorm(p) } else { dm<-prumer-mez hm<-prumer+mez } idx2<-y<dm idx3<-y>hm idx<-as.logical(idx1+idx2+idx3) z <- embed(idx,span) rowSums(z) length(rowSums(z)) sumy<-rowSums(z)>0 index<-c(rep(sumy[1],s),sumy,rep(sumy[n-span+1],s)) ### index is a returned logical vector and it is OK if (nahradit) y[index]<<-NA ### this is the ghastly line which does not work as I expected :-( invisible(index) } Thank you Best regardsPetr Pikal petr.pikal at precheza.cz p.pik at volny.cz