【问题标题】:R, Trying to transform a vector of integer to a specific binary MatrixR,试图将整数向量转换为特定的二进制矩阵
【发布时间】:2021-05-17 14:10:47
【问题描述】:

我想转换一个整数向量:

vector = c(0,6,1,8,5,4,2)

length(vector) = 7

max(vector) = 8

到nrow = length(vector)和ncol = max(vector)的矩阵m

m = 

0 0 0 0 0 0 0 0

1 1 1 1 1 1 0 0

1 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1

1 1 1 1 1 0 0 0

1 1 1 1 0 0 0 0

1 1 0 0 0 0 0 0

这只是我想要做的一个例子。我希望该函数适用于每个整数向量。

我尝试使用函数 mapply(rep, 1, vector) 但我得到了一个列表,但我没有成功将它转换为矩阵...

如果有人可以帮助我,那对我非常有用。

最好的问候,

马克西姆

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您在变量vector 的每个元素上使用c(rep(1, x), rep(0, max(vector-x)),您将获得所需的二进制结果。用sapply 循环它甚至会返回一个矩阵。您只需要在之后转置它即可得到结果。

    vector = c(0,6,1,8,5,4,2)
    result <- t(sapply(vector, function(x) c(rep(1, x), rep(0, max(vector)-x))))
    
    is.matrix(result)
    #> [1] TRUE
    
    result
    #>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    #> [1,]    0    0    0    0    0    0    0    0
    #> [2,]    1    1    1    1    1    1    0    0
    #> [3,]    1    0    0    0    0    0    0    0
    #> [4,]    1    1    1    1    1    1    1    1
    #> [5,]    1    1    1    1    1    0    0    0
    #> [6,]    1    1    1    1    0    0    0    0
    #> [7,]    1    1    0    0    0    0    0    0
    

    将其放入函数很容易:

      binaryMatrix <- function(v) {
        t(sapply(v, function(x) c(rep(1, x), rep(0, max(v)-x))))
      }
      binaryMatrix(vector)
      # same result as before
    

    reprex package (v1.0.0) 于 2021-02-14 创建

    【讨论】:

    • 太棒了!祝你有美好的一天,一月
    【解决方案2】:

    另一种直接的方法是利用矩阵形式的行/列索引来利用矩阵子分配(另请参见?Extract)。

    定义一个0的矩阵:

    x = c(0, 6, 1, 8, 5, 4, 2)
    m = matrix(0L, nrow = length(x), ncol = max(x))
    

    并用 1s 填充:

    i = rep(seq_along(x), x)  ## row indices of 1s
    j = sequence(x)           ## column indices of 1s
    ij = cbind(i, j)          
    m[ij] = 1L
    
    m
    #     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    #[1,]    0    0    0    0    0    0    0    0
    #[2,]    1    1    1    1    1    1    0    0
    #[3,]    1    0    0    0    0    0    0    0
    #[4,]    1    1    1    1    1    1    1    1
    #[5,]    1    1    1    1    1    0    0    0
    #[6,]    1    1    1    1    0    0    0    0
    #[7,]    1    1    0    0    0    0    0    0
            
    

    【讨论】:

      【解决方案3】:

      假设向量中的所有值都是非负整数,可以定义如下函数

      transformVectorToMatrix <- function(v) {
        
        nrOfCols <- max(v)
        
        zeroRow <- integer(nrOfCols)
        
        do.call("rbind",lapply(v,function(nrOfOnes) {
          if(nrOfOnes==0) return(zeroRow)
          if(nrOfOnes==nrOfCols) return(zeroRow+1)
          c(integer(nrOfOnes)+1,integer(nrOfCols-nrOfOnes))
        }))
      }
      

      终于做完了

      m = transformVectorToMatrix(vector)
      

      得到你想要的二进制矩阵。

      【讨论】:

      • 祝你有美好的一天!
      猜你喜欢
      • 2019-05-02
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2012-12-03
      相关资源
      最近更新 更多