从大列表中列出零和一列

时间:2017-08-20 01:25:00

标签: r

我有一个非常大的列表,如下所示:

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

但由于数据集太大,我遇到了内存限制。

我正在考虑使用拆分,应用,组合技术,但无法获得所需的结果。

非常感谢帮助!

2 个答案:

答案 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