【问题标题】:Counting number of rows equal to the rows in another matrix in R计算行数等于 R 中另一个矩阵中的行数
【发布时间】:2018-03-25 22:46:23
【问题描述】:

我有下一个问题。我有一个矩阵 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

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]. 

你能帮帮我吗?我不想使用循环,因为我的代码中有足够的内容,并且应该进入循环。

非常感谢-

【问题讨论】:

    标签: r matrix count


    【解决方案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
    

    【讨论】:

    • 这个方案恐怕有问题。想象一下A 的一行以11, 2, 3, ... 开头。然后该行将变为1123...,如果该行是“1、12、3,...”,则相同。我认为这就是@42 提出分隔符的原因。
    • 非常感谢您的回答。我将它用于代码中,它将时间从 896.04 秒减少到 196.23 秒,这太棒了,因为我必须大量使用此代码。
    【解决方案2】:

    另一种解决方案,有点类似于@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
    

    【讨论】:

    • 我担心identical 在矩阵具有不同维度名称时可能会导致问题。在这种情况下,应将identical(vect, matRow) 替换为all(vect==matRow)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多