2016-12-07 2 views
0

У меня есть основной вопрос о функции слияния.R: Слияние матриц по именам столбцов

С моей точки зрения, слияние (mat1, mat2) должно объединять матрицы по именам столбцов, сохраняя присутствующие в обеих матрицах.

У меня есть две таблицы (примеры ниже). Имена строк различаются, но некоторые имена столбцов являются общими. Я хочу, чтобы столбцы, которые находятся в общем:

MAT1:

B C D E 
a x x x x 
b x x x x 
c x x x x 
d x x x x 
e x x x x 

и MAT2:

B E F G 
f y y y y 
g y y y y 
h y y y y 
i y y y y 
j y y y y 

поэтому выход должен быть что-то вроде:

B E 
a x x 
b x x 
c x x 
d x x 
e x x 
f y y 
g y y 
h y y 
i y y 
j y y 

Однако слияние (mat1, mat2) возвращается:

> merge(test, testt) 
[1] B E C D F G 
<0 rows> (or 0-length row.names) 

Должно быть, я делаю что-то неправильно. Любой совет? Спасибо!

+2

Я думаю, вы хотите 'rbind (mat1 [, c (1,4)], mat2 [, c (1,2)]) вместо этого? – aichao

+1

'merge' не делает то, что вы думаете. Он выполняет соединение между таблицами (и часто используется с 'data.frame', а не с матрицами). Ваша цель, возможно, достигается с помощью 'commoncols <-intersect (colnames (mat1), colnames (mat2)); rbind (mat1 [, commoncols], mat2 [, commoncols]) ' – nicola

+0

@aichao no, так как я не хочу указывать, какие столбцы являются общими. Я буду применять это для очень больших таблиц – arielle

ответ

1

Вы можете сделать это с помощью rbind и проверить, соответствуют ли имена столбцов автоматически.

Если вы используете data.table вы можете сделать это:

DT1 = data.table(1:2,1:2) 
DT2 = data.table(1:2,1:2,1:2) 
rbind(DT1[,which(colnames(DT1) %in% colnames(DT2)),with = FALSE],DT2[,which(colnames(DT2) %in% colnames(DT1)),with = FALSE]) 

Выход:

V1 V2 
1 1 
2 2 
1 1 
2 2 

Для data.frame:

DF1 = data.frame(1:2,1:2) 
DF2 = data.frame(1:2,1:2,1:2) 
rbind(DF1[,which(colnames(DF1) %in% colnames(DF2))],DF2[,which(colnames(DF2) %in% colnames(DF1))]) 

Выход:

X1.2 X1.2.1 
    1  1 
    2  2 
    1  1 
    2  2 
+1

Это работает, спасибо! – arielle