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;