计算与R中另一个矩阵中的行数相等的行数
我有下一个问题。我有一个矩阵a,它的行都是序列计算与R中另一个矩阵中的行数相等的行数,r,matrix,count,R,Matrix,Count,我有下一个问题。我有一个矩阵a,它的行都是序列seq(1:D)的可能排列。我还有其他的D矩阵,它们的行也是排列。我想生成一个维数D的矩阵!xD的[i,j]组件是与i-th矩阵中A的j-th行相同的行数。 一个简单的例子: A= [1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1] #Matrix of all posible permutations 及 及 我想要的输出是 count= [2,1 0,0
seq(1:D)
的可能排列。我还有其他的D矩阵,它们的行也是排列。我想生成一个维数D的矩阵!xD
的[i,j]
组件是与i-th
矩阵中A的j-th
行相同的行数。
一个简单的例子:
A= [1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1] #Matrix of all posible permutations
及
及
我想要的输出是
count= [2,1
0,0
0,1
0,1
0,0
1,0].
你能帮我吗?我不想使用循环,因为我的代码中有足够的内容,这应该是一个循环
非常感谢-数据:
A <- matrix( c(1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1), nrow = 6, ncol = 3, byrow = TRUE)
B <- matrix( c( 1,2,3,1,2,3,3,2,1), nrow = 3, byrow = TRUE)
C <- matrix( c(2,1,3,1,2,3,2,3,1), nrow = 3, byrow = TRUE)
# [,1] [,2]
# [1,] 2 1
# [2,] 0 0
# [3,] 0 1
# [4,] 0 1
# [5,] 0 0
# [6,] 1 0
另一个解决方案,有点类似于@Sathish的解决方案:
A <- matrix( c(1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1), nrow = 6, ncol = 3, byrow = TRUE)
B <- matrix( c( 1,2,3,1,2,3,3,2,1), nrow = 3, byrow = TRUE)
C <- matrix( c(2,1,3,1,2,3,2,3,1), nrow = 3, byrow = TRUE)
# count rows of a matrix M equal to a vector vect
rowsEqualToVector <- function(vect, M){
sum(apply(M, 1, function(matRow) identical(vect, matRow)))
}
# apply the previous function to each row of a matrix A
sameRows <- function(A,M){
apply(A, 1, function(row) rowsEqualToVector(row, M))
}
# map the previous function to a list of matrices
sapply(list(B,C), function(M) sameRows(A,M))
使用分隔符(如
\uu
或
)折叠可能更安全。我认为请求的是匹配的位置,而不是计数。恐怕此解决方案有问题。设想一行A
以11,2,3,…
开头。然后该行将变为1123…
,如果该行是“1、12、3、…”则相同。我想这就是@42建议使用分隔符的原因。非常感谢您的回答。我把它用在了一个代码中,它把时间从896.04秒减少到了196.23秒,这是一个非常糟糕的原因,因为我必须使用这个代码很多次。我担心当矩阵有不同的维度名称时,idential
可能会导致问题。在这种情况下,应将idential(vect,matRow)
替换为all(vect==matRow)
。
A <- apply(A, 1, paste0, collapse = "_")
B <- apply(B, 1, paste0, collapse = "_")
C <- apply(C, 1, paste0, collapse = "_")
sapply( list(B,C), function(x) {
sapply( A, function(y) sum(x %in% y))
})
# [,1] [,2]
# [1,] 2 1
# [2,] 0 0
# [3,] 0 1
# [4,] 0 1
# [5,] 0 0
# [6,] 1 0
A <- matrix( c(1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1), nrow = 6, ncol = 3, byrow = TRUE)
B <- matrix( c( 1,2,3,1,2,3,3,2,1), nrow = 3, byrow = TRUE)
C <- matrix( c(2,1,3,1,2,3,2,3,1), nrow = 3, byrow = TRUE)
# count rows of a matrix M equal to a vector vect
rowsEqualToVector <- function(vect, M){
sum(apply(M, 1, function(matRow) identical(vect, matRow)))
}
# apply the previous function to each row of a matrix A
sameRows <- function(A,M){
apply(A, 1, function(row) rowsEqualToVector(row, M))
}
# map the previous function to a list of matrices
sapply(list(B,C), function(M) sameRows(A,M))
> sapply(list(B,C), function(M) sameRows(A,M))
[,1] [,2]
[1,] 2 1
[2,] 0 0
[3,] 0 1
[4,] 0 1
[5,] 0 0
[6,] 1 0