Мы можем использовать melt/acast
от reshape2
после cbind
Как для матриц «a», так и «b» (на основе сообщения @ thelatemail).
library(reshape2)
acast(melt(cbind(a,b)), Var1~Var2, value.var='value', sum)
# A B C D
#1 1 17 17 16
#2 2 19 19 17
#3 3 21 21 18
Или мы находим имена столбцов, которые являются общими как с помощью intersect
, имена столбцов, которые можно найти в одной матрице, а не в другой с setdiff
. Подмножая обе матрицы с общими именами, мы добавляем их вместе, а затем cbind
столбцы как в «a», так и «b» на основе вывода setdiff
.
nm1 <- intersect(colnames(a), colnames(b))
nm2 <- setdiff(colnames(a), colnames(b))
nm3 <- setdiff(colnames(b), colnames(a))
cbind(a[,nm2, drop=FALSE], a[,nm1]+b[,nm1], b[,nm3,drop=FALSE])
# A B C D
#[1,] 1 17 17 16
#[2,] 2 19 19 17
#[3,] 3 21 21 18
Другим вариантом было бы создать еще один matrix
со всеми уникальными столбцами в «а» и «B», а затем заменить значения в этом
nm <- union(colnames(a), colnames(b))
m1 <- matrix(0, ncol=length(nm), nrow=nrow(a), dimnames=list(NULL, nm))
m1[,colnames(a)] <- a
m1[,colnames(b)] <- m1[,colnames(b)] +b
m1
# A B C D
#[1,] 1 17 17 16
#[2,] 2 19 19 17
#[3,] 3 21 21 18
Мы могли бы также cbind
и матрицы и использовать tapply
для получения sum
после группировки с индексами столбцов и строк
m2 <- cbind(a, b)
t(tapply(m2,list(colnames(m2)[col(m2)], row(m2)), FUN=sum))
Или перебрать 'нм' и получить sum
sapply(nm, function(i) rowSums(m2[,colnames(m2) ==i, drop=FALSE]))
Это хороший вариант. +1 – akrun