R:将两个矩阵中的公共行组合在一起

时间:2013-10-18 13:07:01

标签: r merge

我有两个矩阵。我想将它们组合起来,使得Matrix2中的任何元素(但不在Matrix2(scenario1)中)被添加到Matrix2的末尾。但是,如果一个元素同时在Matrix1和Matrix2(scenario2)中,那么我想用Matrix1的相应行的列覆盖Matrix2的那一行中的某些列。

我看了一下ddply和merge,它似乎满足了scenario1,但我无法解决有关scenario2的问题。

一个例子:
原始矩阵: Matrix2

Col1 Col2 Col3 Col4
ABC 100 200  900
DEF 300 400  1000

Matrix1

Col1 Col2 Col3
HIJ 500 600  
ABC 700 800
KLM 1100 1200

新的Matrix2:

Col1 Col2 Col3 Col4
ABC 700 800 900
DEF 300 400  1000
HIJ 500 600 0
KLM 1100 1200 0

原始Matrix2中的第一行已被Matrix1中的相应行替换,而Matrix1和Matrix2中的第二行都已添加到末尾。 Matrix2(Col4)中的额外列在组合矩阵时未调整。此外,矩阵具有不同的维度。

任何帮助都会很棒!

由于

麦克

1 个答案:

答案 0 :(得分:3)

使用rbindduplicated的解决方案可能有用:

m1m2 <- rbind(Matrix2, Matrix1)
m1m2[!duplicated(m1m2$Col1), ]
#   Col1 Col2 Col3
# 1  HIJ  500  600
# 2  ABC  700  800
# 4  DEF  300  400

“Col1”的结果顺序是否重要?


更新

根据您的更新,您可以在“reshape2”包中查找包含meltmergeduplicateddcast的选项:

library(reshape2)
M1 <- melt(Matrix1, id.vars="Col1") ## Convert your data into a "long" format
M2 <- melt(Matrix2, id.vars="Col1")
M1M2 <- merge(M1, M2, all = TRUE)   ## Merge this long data
dcast(M1M2[!duplicated(M1M2[1:2], fromLast=TRUE), ], Col1 ~ variable, fill=0)
#   Col1 Col2 Col3 Col4
# 1  ABC  700  800  900
# 2  DEF  300  400 1000
# 3  HIJ  500  600    0
# 4  KLM 1100 1200    0

我的猜测是你可能需要在这里添加另一个变量来识别源data.frame,以确保你在最后一步中获取正确的数据。