我有一个非常大的列表,如下所示:
1
2
3
3
并且需要创建一个如下所示的列表:
|------|------|------|------|
| 1 | 1 | 0 | 0 |
|------|------|------|------|
| 2 | 0 | 1 | 0 |
|------|------|------|------|
| 3 | 0 | 0 | 1 |
|------|------|------|------|
| 3 | 0 | 0 | 1 |
|------|------|------|------|
我尝试过使用循环,以及此处详述的方法:
Create mutually exclusive dummy variables from categorical variable in R
但由于数据集太大,我遇到了内存限制。
我正在考虑使用拆分,应用,组合技术,但无法获得所需的结果。
非常感谢帮助!
答案 0 :(得分:3)
以下是一些方法:
1)外部这给出了一个矩阵结果:
x <- c(1, 2, 3, 3)
outer(x, unique(x), "==") + 0
,并提供:
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
[4,] 0 0 1
2)model.matrix 这也给出了矩阵结果。
fx <- factor(x)
model.matrix(~ fx + 0)
,并提供:
fx1 fx2 fx3
1 1 0 0
2 0 1 0
3 0 0 1
4 0 0 1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$fx
[1] "contr.treatment"
3)sparseMatrix 这会为结果使用稀疏矩阵内部表示,因此不会将存储用于零。
library(Matrix)
# ok for this example
sparseMatrix(seq_along(x), x)
# but if x does not contain sequence numbers use this instead
sparseMatrix(seq_along(x), as.numeric(factor(x)))
,并提供:
4 x 3 sparse Matrix of class "dgCMatrix"
[1,] 1 . .
[2,] . 1 .
[3,] . . 1
[4,] . . 1
答案 1 :(得分:2)
vars = c(1, 2, 3, 3)
data.frame(vars,
replace(matrix(rep(0, max(vars) * length(vars)), nrow = length(vars)),
cbind(seq_along(vars), vars),
1))
# vars X1 X2 X3
#1 1 1 0 0
#2 2 0 1 0
#3 3 0 0 1
#4 3 0 0 1