R 如何将一个矩阵的行相对于另一个矩阵重新排序?

R 如何将一个矩阵的行相对于另一个矩阵重新排序?,r,R,我有两个不同维度的大矩阵A和B。我想对矩阵B的行与矩阵A的行进行排序。并将值为0的行添加到矩阵B,前提是该行不存在于B中,而存在于A 以下是可复制的示例和预期输出: A<-matrix(c(1:40), ncol=8) rownames(A)<-c("B", "A", "C", "D", "E") > A [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] B 1 6 11 16 21 26 31 36 A

我有两个不同维度的大矩阵
A
B
。我想对矩阵
B
的行与矩阵
A
的行进行排序。并将值为
0
的行添加到矩阵
B
,前提是该行不存在于
B
中,而存在于
A

以下是可复制的示例和预期输出:

A<-matrix(c(1:40), ncol=8)
rownames(A)<-c("B", "A", "C", "D", "E")

> A
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
B    1    6   11   16   21   26   31   36
A    2    7   12   17   22   27   32   37
C    3    8   13   18   23   28   33   38
D    4    9   14   19   24   29   34   39
E    5   10   15   20   25   30   35   40

> B<-matrix(c(100:108),ncol=3)
 rownames(B)<-c("A", "E", "C")

> B
  [,1] [,2] [,3]
A  100  103  106
E  101  104  107
C  102  105  108
有人能帮我在R中实现这一点吗?

方法可以是:

res = as.table(array(0, c(nrow(A), ncol(B)), list(rownames(A), NULL)))
B2 = as.data.frame(as.table(B))
res[as.matrix(B2[1:2])] = B2[[3]]
res  ##which can be converted back to a `colnames`less matrix
#    A   B   C
#B   0   0   0
#A 100 103 106
#C 102 105 108
#D   0   0   0
#E 101 104 107
另一种方法

> temp <- A[,seq(ncol(B))]*0            
> temp[rownames(B), ] <- B            
> (B <- temp)
#      [,1] [,2] [,3]
#B    0    0    0
#A  100  103  106
#C  102  105  108
#D    0    0    0
#E  101  104  107

>temp[rownames(B),](B来自sql背景这是我第一次想到的。其他答案要好得多

A1 = cbind(id = rownames(A),as.data.frame(A), stringsAsFactors = FALSE)
B1 = cbind(id = rownames(B),as.data.frame(B), stringsAsFactors = FALSE)
AB = merge(A1, B1, by = "id", all = T)
AB1 = as.matrix(AB[,(dim(A1)[2] + 1) : dim(AB)[2]])
dimnames(AB1) = NULL
AB1[is.na(AB1)] = 0
rownames(AB1) = AB[,1]
(B = AB1[match(AB[,1],A1[,1]),])

关于你对
pd.np.ptp
的评论,…(-:我也为此感到内疚。然而,我这样做是为了证明一个观点。有些人在导入另一个库时感到尴尬。我的观点是熊猫已经导入了numpy。为了证明这一点,我没有导入numpy,只是使用了
pd.np.ptp
。但我从未在实践中使用过它。
A1 = cbind(id = rownames(A),as.data.frame(A), stringsAsFactors = FALSE)
B1 = cbind(id = rownames(B),as.data.frame(B), stringsAsFactors = FALSE)
AB = merge(A1, B1, by = "id", all = T)
AB1 = as.matrix(AB[,(dim(A1)[2] + 1) : dim(AB)[2]])
dimnames(AB1) = NULL
AB1[is.na(AB1)] = 0
rownames(AB1) = AB[,1]
(B = AB1[match(AB[,1],A1[,1]),])