给定长度为 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}
但是对于这种类型的操作有一个很好的衬垫吗?
我们可以在
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)
与模型师:
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
尝试
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
我们可以
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)