计算行数等于R中另一个矩阵中的行数

时间:2018-03-25 03:39:30

标签: r matrix count

我有下一个问题。我有一个矩阵A,其行是序列seq(1:D)的所有可能排列。我有其他D矩阵,其行也是排列。我想生成一个维度为D!xD的矩阵,其[i,j]分量是与j-th矩阵中A的i-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

B= [1,2,3
    1,2,3
    3,2,1] #One of my D matrixes

C=[2,1,3
   1,2,3
   2,3,1]. #Another of my matrixes

我正在寻找的输出是

count= [2,1
        0,0
        0,1
        0,1
        0,0
        1,0]. 
你可以帮帮我吗?我不想使用循环,因为我的代码中有足够的东西,这应该是循环的。

非常感谢你 -

2 个答案:

答案 0 :(得分:1)

数据:

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)

代码:每行将列合并为一个数字字符串,并将A的矢量与B和C进行比较。

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

答案 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))

输出:

> 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