我有一个在数据框中的列向量,想将其转换为二进制矩阵,以便稍后可以进行矩阵乘法运算。
y_labels
1
4
4
3
期望的输出
1 0 0 0
0 0 0 1
0 0 0 1
0 0 1 0
在Octave中,我会这样做:y_matrix = (y_labels == [1 2 3 4])
。然而,在R中,我无法弄清楚如何实现。有人知道吗?
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
如果您有一个数值向量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
df$y_labels
替换 vec
。不过标题中说的是一个数字向量。 - 989首先创建一个零矩阵:
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
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
dummy::dummy(data.frame(myF = factor(df1$y_labels, levels = 1:4)))
- zx8754