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

3

我有一个在数据框中的列向量,想将其转换为二进制矩阵,以便稍后可以进行矩阵乘法运算。

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中,我无法弄清楚如何实现。有人知道吗?


尝试使用 dummy::dummy(data.frame(myF = factor(df1$y_labels, levels = 1:4))) - zx8754
你是不是想写 dummies::dummy(data.frame(myF = factor(df1$y_labels, levels = 1:4)))? - zipline86
它们是不同的软件包,但都应该提供类似的结果。 - zx8754
好的,谢谢你的帮助! - zipline86
4个回答

3
我们可以使用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 是什么意思?我有点困惑了。 - zipline86
@zipline86,这是要移除截距列。 - akrun
1
非常感谢您的帮助! - zipline86

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

1
不确定这是否是 OP 的用例,但矩阵可能不是方阵。 - moodymudskipper
只是一点小提醒,OP 表示他们的输入是一个数据框(data.frame),而不是一个原子向量。 - talat
@docendodiscimus 是的,但是应该使用 df$y_labels 替换 vec。不过标题中说的是一个数字向量。 - 989

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

啊,好的,很酷,这有点类似于我在Octave中的做法。谢谢! - zipline86

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接