require(data.table); cat("K,N,S", "K1,1,A", "K2,2,B", "K3,3,C", file="f1.dat", sep="\n"); cat("K,N,S", "K2,9,Z", "K3,,", file="f2.dat", sep="\n"); dt1 <- data.table(read.table("f1.dat", sep=",", header=TRUE, stringsAsFactors=FALSE, na.strings=""), key=c("K")); dt2 <- data.table(read.table("f2.dat", sep=",", header=TRUE, stringsAsFactors=FALSE, na.strings=""), key=c("K")); tables(); dt1; dt2; if (!identical(names(dt1), names(dt2))) stop("Assumed for now. Can relax later if needed."); w = chmatch(dt2$K, dt1$K); for (i in 2:ncol(dt2)) { nna = !is.na(dt2[[i]]); set(dt1,w[nna],i,dt2[[i]][nna]); } dt1 = rbind(dt1, dt2[is.na(w)]); dt1;