我在 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中得到这个。任何人都知道怎么做?
答案 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