从计数数组创建 1 的矩阵

问题描述 投票:0回答:4

给定长度为 6 的 3 个唯一数字的数组,说:

c(1,1,1,2,3,3)

如何构建以下 6x3 矩阵:

[1, 0 , 0]  
[1, 0 , 0]  
[1, 0 , 0]  
[0, 1 , 0]  
[0, 0, 1]  
[0, 0, 1]

天真的方法是:

V = c(1,1,1,2,3,3)
Z = matrix(0,6,3)
for (i in 1:6) {Z[i, V[i]] = 1}

但是对于这种类型的操作有一个很好的衬垫吗?

r matrix sparse-matrix kronecker-product
4个回答
1
投票

我们可以在

model.matrix
中使用
base R

model.matrix(~ . - 1, data.frame(v1 = factor(v1)))

-输出

   v11 v12 v13
1   1   0   0
2   1   0   0
3   1   0   0
4   0   1   0
5   0   0   1
6   0   0   1

或使用

dummy_cols
来自
fastDummies

library(fastDummies)
dummy_cols(v1)[-1]
  .data_1 .data_2 .data_3
1       1       0       0
2       1       0       0
3       1       0       0
4       0       1       0
5       0       0       1
6       0       0       1

数据

v1 <- c(1,1,1,2,3,3)

0
投票

与模型师:

library(modelr)
V = c(1,1,1,2,3,3)
V <- factor(V)
Z <- as.matrix(model_matrix(V , ~ V -1))
Z
    V1 V2 V3
[1,]  1  0  0
[2,]  1  0  0
[3,]  1  0  0
[4,]  0  1  0
[5,]  0  0  1
[6,]  0  0  1

0
投票

尝试

outer

V = c(1,1,1,2,3,3)
+outer(V, unique(V), `==`)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    1    0    0
## [3,]    1    0    0
## [4,]    0    1    0
## [5,]    0    0    1
## [6,]    0    0    1

0
投票

我们可以

vapply
一个
tablulate

t(vapply(v1, \(x) tabulate(x, max(v1)), numeric(max(v1))))
#      [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    1    0    0
# [3,]    1    0    0
# [4,]    0    1    0
# [5,]    0    0    1
# [6,]    0    0    1

资料:

v1 <- c(1, 1, 1, 2, 3, 3)
© www.soinside.com 2019 - 2024. All rights reserved.