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]),])