代码之家  ›  专栏  ›  技术社区  ›  zipline86

将数值向量转换为布尔矩阵[重复]

  •  3
  • zipline86  · 技术社区  · 8 年前

    在a中有一个列向量 数据帧 我想把它变成一个二进制矩阵,这样我以后就可以用它进行矩阵乘法了。

    y_labels
    1
    4
    4
    3
    

    所需输出

    1 0 0 0
    0 0 0 1
    0 0 0 1
    0 0 1 0
    

    在八度音阶中,我会 y_matrix = (y_labels == [1 2 3 4]) . 然而,我不知道如何在R中得到这个。有人知道吗?

    4 回复  |  直到 8 年前
        1
  •  3
  •   akrun    8 年前

    我们可以使用 model.matrix 将其更改为二进制

    model.matrix(~ -1 + factor(y_labels, levels = 1:4), df1)
    

    或与 table

    with(df1, table(1:nrow(df1), factor(y_labels, levels = 1:4)))
    #    1 2 3 4
    #  1 1 0 0 0
    #  2 0 0 0 1
    #  3 0 0 0 1
    #  4 0 0 1 0
    

    或更紧凑

    +(sapply(1:4, `==`, df1$y_labels))
    #      [,1] [,2] [,3] [,4]
    #[1,]    1    0    0    0
    #[2,]    0    0    0    1
    #[3,]    0    0    0    1
    #[4,]    0    0    1    0
    
        2
  •  2
  •   talat    8 年前

    还有一个选择:

    首先创建一个零矩阵:

    m <- matrix(0, nrow = nrow(df), ncol = max(df$y_labels))
    

    然后在正确的位置插入1s:

    m[col(m) == df$y_labels] <- 1
    

    结果是:

         [,1] [,2] [,3] [,4]
    [1,]    1    0    0    0
    [2,]    0    0    0    1
    [3,]    0    0    0    1
    [4,]    0    0    1    0
    
        3
  •  2
  •   989    8 年前

    (在哪里)怎么样 vec 是数值向量):

    m <- matrix(0, length(vec), max(vec))
    m[cbind(seq_along(vec), vec)] <- 1
    
    #    [,1] [,2] [,3] [,4]
    #[1,]    1    0    0    0
    #[2,]    0    0    0    1
    #[3,]    0    0    0    1
    #[4,]    0    0    1    0
    
        4
  •  1
  •   moodymudskipper    8 年前

    在base中 R :

    df1 <- data.frame(y_labels = c(1,4,4,3))
    t(sapply(df1$y_labels,function(x) c(rep(0,x-1),1,rep(0,max(df1$y_labels)-x))))
    

    t(sapply(df1$y_labels,function(x) `[<-`(numeric(max(df1$y_labels)),x,1)))
    

    输出:

    #      [,1] [,2] [,3] [,4]
    # [1,]    1    0    0    0
    # [2,]    0    0    0    1
    # [3,]    0    0    0    1
    # [4,]    0    0    1    0