Dear Mao, Here is another way: yourdata$traits2 <- with(yourdata, do.call(c, tapply(traits, group, function(y){ ym <- mean(y,na.rm=TRUE) y[is.na(y)]<- ym y } )))
HTH, Jorge On Mon, Jun 8, 2009 at 9:56 PM, Mao Jianfeng <jianfeng....@gmail.com> wrote: > Dear Ruser's > > I ask for helps on how to substitute missing values (NAs) by mean of the > group it is belonging to. > > my dummy dataframe is: > > > df > group traits > 1 BSPy01-10 NA > 2 BSPy01-10 7.3 > 3 BSPy01-10 7.3 > 4 BSPy01-11 5.3 > 5 BSPy01-11 5.4 > 6 BSPy01-11 5.6 > 7 BSPy01-11 NA > 8 BSPy01-11 NA > 9 BSPy01-11 4.8 > 10 BSPy01-12 8.1 > 11 BSPy01-12 6.0 > 12 BSPy01-12 6.0 > 13 BSPy01-13 6.1 > > > I want to substitute each "NA" by the group mean of which the "NA" is > belonging to. For example, substitute the first record of traits "NA" by > the > mean of "BSPy01-10". > > I have ever tried to solve this problem by using doBy package. But, I > failed. I ask for the right solutions by using doBy package or not. > > The commands used and the output I got are as followed: > > library(doBy) > df<-orderBy(~group,data=df) # succeeded > f1<-function(x){m<-mean(x, na.ram=TRUE); x[is.na(x)]<-m; x} # succeeded > datatraits<-lapplyBy(traits~group,data=df, FUN=f1(traits)) # failed > errors: mean(x, na.ram = TRUE), can not find 'traits'. > > Thanks in advance. > > Sincerely, > > Mao J-F > > [[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.