将数字向量转换为布尔矩阵

时间:2018-02-05 10:16:21

标签: r matrix vector boolean

我在 dataframe 中有一个列向量,并希望将其转换为二进制矩阵,以便稍后我可以使用它进行矩阵乘法。

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

期望的输出

y_matrix = (y_labels == [1 2 3 4])

在Octave,我会做类似{{1}}的事情。但是,我无法弄清楚如何在R中得到这个。任何人都知道怎么做?

4 个答案:

答案 0 :(得分:2)

我们可以使用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

答案 1 :(得分:2)

如何(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

答案 2 :(得分:2)

这是另一种选择:

首先创建一个零矩阵:

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

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

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 :(得分:1)

在基地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