2015-09-01 3 views
3

Это кажется действительно основным, но я не могу понять это. Как вы добавляете два массива вместе в R по имени столбца? Например:R добавить массивы по имени столбца

a<-matrix(1:9,ncol=3) 
colnames(a)<-c("A","B","C") 
a 
#  A B C 
#[1,] 1 4 7 
#[2,] 2 5 8 
#[3,] 3 6 9 

b <-matrix(10:18,ncol=3) 
colnames(b)<-c("C","B","D") 
b 
#  C B D 
#[1,] 10 13 16 
#[2,] 11 14 17 
#[3,] 12 15 18 

Я хотел бы, чтобы добавить их вместе таким образом, чтобы получить:

#  A B C D 
#[1,] 1 17 17 16 
#[2,] 2 19 19 17 
#[3,] 3 21 21 18 

Я полагаю, я мог бы добавить дополнительные столбцы для обеих матриц, но кажется, что там будет один чтобы выполнить это. Благодаря!

ответ

3

Использование xtabs, после плавления комбинированного стола с длинной data.frame:

xtabs(Freq ~ ., data=as.data.frame.table(cbind(a,b))) 
# Var2 
#Var1 A B C D 
# A 1 17 17 16 
# B 2 19 19 17 
# C 3 21 21 18 

rownames будет просто езда на велосипеде до LETTERS

+0

Это хороший вариант. +1 – akrun

2

Мы можем использовать 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])) 
Смежные вопросы