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

create a sparse matrix; given the indices of non-zero elements for creation of dummy variables of a categorical column of a large dataset

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

数据结构为:

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

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

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

这是我的数据示例:

 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 循环,但想不出另一种方法来做到这一点。


编辑:我想补充一点,我曾尝试使用 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。

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

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

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

试试这个:

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