r - 创建一个稀疏矩阵;给定非零元素的索引,用于创建大型数据集分类列的虚拟变量



我正在尝试使用稀疏矩阵为一组包含 580 万行和两个分类列的数据生成虚拟变量。

数据的结构为:

mydata:包含 5,800,000 行和两个分类(整数格式)变量 Var1 和 Var2 的 data.table

nlevel(Var1) : 210,000(级别包括 1 到 210,000 之间的所有数字)

nlevel(Var2) : 500 (级别包括 1 到 500 之间的所有数字)

下面是 MyData 的示例:

Var_1      Var_2
1          4
1          2
2          7
5          9
5          500
.
.
.
200         6
200         2
200         80
.
.
.

我正在使用稀疏矩阵 (sparse_Mx) 来创建虚拟变量矩阵,其形式为:

Var_1       Var_2_level_1     Var_2_level_2   . . .    Var_2_level_500
1                0                   1                    0
2                0                   0                    0
3                1                   1                    0
4                0                   0                    0
5                0                   0                    1
.
.
.
200              0                    1                    0
.
.
.
210,000           ...                 ...                  ...

我不知道如何有效地做到这一点,所以我使用 for 循环来创建虚拟变量矩阵:

library(Matrix) #for sparse matrices
m2 <- Matrix(0, nrow = 210000, ncol = 500 , sparse = TRUE) 
for (i in 1: nrow(mydata))
sparse_Mx[ mydata[i, Var_1] , mydata[i, Var_2] ] <- 1

它基本上遍历 mydata 的每一行,并根据行 Var1 值(确定矩阵中的行)和行 Var2 值(确定矩阵中的列号,用 1 填充稀疏矩阵。

它有效,除了它需要永远(因为 for 循环必须经过 5,800,000 个循环!

有没有办法更有效地做到这一点? 我真的很不喜欢为此目的使用 for-loop,但想不出另一种方法来做到这一点。


编辑:我想补充一点,我已经尝试使用sparse.model.matrix(),但无济于事。 生成的矩阵格式不正确(210,000 行和 500 列)。

变量被转换为因子,并使用以下方法:

sp_mx <- sparse.model.matrix( ~ . -1 , data = mydata)

但是,我得到的稀疏矩阵为 [5,800,000 x 500 ],而不是 [210,000 x 500] 的矩阵

我尝试了许多变化,结果仍然相同:

sp_mx <- sparse.model.matrix( ~ Var2 -1 , data = mydata)

sp_mx <- sparse.model.matrix(Var1 ~ Var2 -1 , data = mydata)

所有这些都会导致包含所有行的稀疏矩阵。 我需要的是一个 [210,000 x 500] 矩阵,每行中有多个 1。

试试这个:

spmat<-Matrix(0,nrow = 210000 ,ncol = 500,sparse = T)
locs<-Matrix(data=c(mydata$Var_1,mydata$Var_2),byrow=F,ncol=2)
spmat[locs]=1

为什么你想要稀疏矩阵?对于虚拟矩阵,您也可以只使用:

model.matrix(~ . + 0, data = df)

0 表示无截距,. 表示将变换所有分类变量。请务必事先使用 as.factor() 将这些变量设置为因子。

最新更新