Hi,May be this helps: dat1 <- read.table(text="ID 1 2 3 4 5 6 A 1988 1995 2000 2000 2007 B 1995 1997 2000 2001 C 2001 2008 2010",sep="",header=TRUE,check.names=FALSE, fill=TRUE,stringsAsFactors=FALSE) dat1[is.na(dat1)] <-"" dat1 # ID 1 2 3 4 5 6 #1 A 1988 1995 2000 2000 2007 #2 B 1995 1997 2000 2001 #3 C 2001 2008 2010 str(dat1) #'data.frame': 3 obs. of 7 variables: # $ ID: chr "A" "B" "C" # $ 1 : int 1988 1995 2001 # $ 2 : int 1995 1997 2008 # $ 3 : int 2000 2000 2010 # $ 4 : chr "2000" "2001" "" # $ 5 : chr "2007" "" "" # $ 6 : chr "" "" "" #Suppose, you already read the data as shown in the post: dat <- read.csv("Laura.csv",header=TRUE,stringsAsFactors=FALSE,check.names=FALSE) dat[is.na(dat)] <- "" dat # ID 1 2 3 4 5 6 #1 A 1998 1995 2000 2000 2007 #2 B 1995 1997 2000 2001 #3 C 2001 2008 2010 dat[,-1] <- do.call(rbind,lapply(seq_len(nrow(dat)),function(i) {x <- dat[i,-1]; indx <- x!=""; c(x[indx],rep("",length(x)-length(x[indx])))})) dat # ID 1 2 3 4 5 6 #1 A 1998 1995 2000 2000 2007 #2 B 1995 1997 2000 2001 #3 C 2001 2008 2010 A.K. I would like to remove null values in a dataframe and shift all data left. I have something like: ID 1 2 3 4 5 6 A 1988 1995 2000 2000 2007 B 1995 1997 2000 2001 C 2001 2008 2010 I want something like: ID 1 2 3 4 5 6 A 1988 1995 2000 2000 2007 B 1995 1997 2000 2001 C 2001 2008 2010 Any suggestions on how to accomplish this?