我有两个矩阵。我想将它们组合起来,使得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)中的额外列在组合矩阵时未调整。此外,矩阵具有不同的维度。
任何帮助都会很棒!
由于
麦克
答案 0 :(得分:3)
使用rbind
和duplicated
的解决方案可能有用:
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”包中查找包含melt
,merge
,duplicated
和dcast
的选项:
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
,以确保你在最后一步中获取正确的数据。