Вот забавный базовый метод R с Reduce
.
Reduce(cbind,
list(Reduce("+", list(df1[intersect(names(df1), names(df2))],
df2[intersect(names(df1), names(df2))])), # sum results
df1[setdiff(names(df1), names(df2))], # in df1, not df2
df2[setdiff(names(df2), names(df1))])) # in df2, not df1
Это возвращает
A C D B
1 2 2 1 1
2 4 4 2 2
Предполагается, что в df1 и df2 есть столбцы, которых нет в другом. Если это не так, вам придется настроить список.
Обратите внимание, что вы можете заменить Reduce
на do.call
в обоих местах, и вы получите тот же результат.