2017-08-20 2 views
0

私はこのようになり、非常に大きなリストを持っている:大きなリストから、0と1のリストを作る

と、そのリストを作成する必要がありますが次のようになります。

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

しかし、データセットが大きすぎるため、私はメモリの制約があります。

分割、適用、結合の手法を考えていますが、目的の結果を得ることができません。

大変助かりました!

+1

を私はあなたが現在持っているリスト、そしてどのようにあなたが希望する結果を得ることを期待についてもう少し詳細を与える必要があると思います。他の人が作業するためのデータや期待される結果の一例を提供すれば、非常に役に立ちます。 – SymbolixAU

+1

あなたのマトリックスのサイズはlength(MyList)* length(unique(MyList))になります。それがメモリにとって大きすぎる場合、問題はこの行列を計算する方法ではなく、この行列を表現する方法です。 – G5W

答えて

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 
3

はいくつかの方法である:与える

x <- c(1, 2, 3, 3) 
outer(x, unique(x), "==") + 0 

1)外側これはマトリックス結果を与える

 [,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)は、ゼロのストレージを使用しないので、これは結果を疎行列内部表現を使用を疎行列。与え

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 
関連する問題