https://github.com/hadley/dplyr/blob/master/R/location.R
match_up <- function(x, y) {
both <- intersect(names(x), names(y))
added <- setdiff(names(x), names(y))
deleted <- setdiff(names(y), names(x))
out <- cbind(
old = c(x[both], x[added], rep("<added>", length(deleted))),
new = c(y[both], rep("<deleted>", length(added)), y[deleted])
)
rownames(out) <- c(both, added, deleted)
out[out[, "old"] != out[, "new"], , drop = FALSE]
}