On Sat, 2 Aug 2014 05:22:26 AM Florian Denzinger wrote: > Thank you everyone for your help so far. > > I am still working on the problem to get a merged new dataframe which fills > in new rows with NA values for each year that is missing for plotting with > gaps ( in the example the item BARTLEY: years 1984 to 1987 should be filled > with a row containing NA values). Could someone maybe help me with this?
Hi Florian, This is pretty messy, but it might do what you want: fddf<-read.table(text="NAME,ID,YEAR,VALUE ADAMS,885,1988,-2 ADAMS,885,1989,0 BAHIA DEL DIABLO,2665,1999,4 BAHIA DEL DIABLO,2665,2000,8 BAHIA DEL DIABLO,2665,2001,19 BAHIA DEL DIABLO,2665,2002,13 BAHIA DEL DIABLO,2665,2003,13 BARTLEY,893,1983,0 BARTLEY,893,1988,2 BARTLEY,893,1989,-1 CANADA,877,1972,-1 CLARK CPI,894,1973,-3",sep=",",header=TRUE) fillgaps<-function(x,rangevar,fillvar,fillval=NA) { dimx<-dim(x) if(dimx[1] > 1) { newxrangevar<-min(x[[rangevar]]):max(x[[rangevar]]) nrows<-length(newxrangevar) newx<-list() rangevarno<-which(names(x) %in% rangevar) fillvarno<-which(names(x) %in% fillvar) cat(rangevarno,fillvarno,"\n") for(xcol in 1:dimx[2]) { if(xcol == rangevarno) { newx[[xcol]]<-newxrangevar } else { if(xcol == fillvarno) { newx[[xcol]]<-rep(NA,nrows) newx[[xcol]][which(newxrangevar %in% x[[rangevar]])]<-x[[fillvar]] } else { if(is.numeric(x[1,xcol])) newx[[xcol]]<-rep(x[1,xcol],length.out=nrows) else newx[[xcol]]<-rep(as.character(x[1,xcol]),nrows) } } } newx<-as.data.frame(newx) names(newx)<-names(x) } else newx<-x return(newx) } fddfn<-levels(fddf$NAME) for(fdvar in 1:length(fddfnames)) { if(fdvar == 1) newx<-fillgaps(fddf[fddf$NAME == fddfn[fdvar],],"YEAR","VALUE") else newx<-rbind(newx,fillgaps(fddf[fddf$NAME == fddfn[fdvar],],"YEAR","VALUE")) } Jim ______________________________________________ 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.