【问题标题】:Making a list of zeros and ones from a large list从一个大列表中制作一个零和一的列表
【发布时间】:2017-08-20 01:25:00
【问题描述】:

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

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

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

正在考虑使用拆分、应用、组合技术,但无法获得预期的结果。

非常感谢您的帮助!

【问题讨论】:

  • 我认为您需要提供更多关于您当前拥有的列表的详细信息,以及您希望如何获得所需的结果。如果您提供一些数据供其他人使用,并提供预期结果的示例,这将大有帮助。
  • 你的矩阵的大小将是长度(MyList)*长度(唯一(MyList))。如果这对内存来说太大了,你的问题不是如何计算这个矩阵,而是如何表示这个矩阵。

标签: r


【解决方案1】:

这里有一些方法:

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多