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

R 创建稀疏矩阵;给定用于创建大型数据集分类列的虚拟变量的非零元素索引,r,for-loop,data.table,sparse-matrix,dummy-variable,R,For Loop,Data.table,Sparse Matrix,Dummy Variable,我试图使用稀疏矩阵为一组包含580万行和两个分类列的数据生成虚拟变量 数据结构如下: mydata:data.table包含5800000行和两个分类(整数格式)变量Var1和Var2 NLLevel(Var1):210000(级别包括1到210000之间的所有数字) nlevel(Var2):500(级别包括1到500之间的所有数字) 下面是mydata的一个示例: Var_1 Var_2 1 4 1 2 2

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

数据结构如下:

mydata:data.table包含5800000行和两个分类(整数格式)变量Var1和Var2

NLLevel(Var1):210000(级别包括1到210000之间的所有数字)

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
库(矩阵)#用于稀疏矩阵

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

model.matrix(~ . + 0, data = df)
0表示无截获,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

spmatI我使用稀疏矩阵,因为矩阵变量变大(按大小)。另外,model.matrix不能使用这种格式。它没有给我一个包含200000行和500列的矩阵。(Var1的行和Var2的列级别)啊,明白了。然后您可以尝试:sparse.model.matrix(~-1,data=df),这也不起作用。矩阵的格式不正确,相反,它创建了一个超过1100万行、两列的矩阵。我已经使用了model.matrix和sparse.model.matrix,但我没有得到正确的[210000 x 500]矩阵。我将这两个变量转换为因子,并使用model.matrix,它给了我这个错误:错误:无法分配大小为316.8 Gb的向量,然后我使用sparsed.model.matrix,它给了我一个荒谬维度的古怪矩阵如果我理解正确,mydata中的列(即Var_1和Var_2)表示在稀疏矩阵中需要值1的位置?是的,这是正确的。例如,如果Var1=3且Var2=400,则矩阵在其[3400]位置的值应为1。Var1的值范围为1到210000(级别数),Var2的值范围为1到500(同样,级别数),因此,矩阵的维数应为[210000500],我尝试过稀疏.model.matrix(model.matrix甚至不起作用,并且给我太大的尺寸误差),但得到的矩阵是[5.8M x 500]是,给我这个错误:矩阵中的错误(data=c(levels(mydata$Var1)、levels(mydata$Var2)),:“data”必须是向量type@Ankhnesmerira我对答案做了修改。它现在应该可以正常工作了。这么简单,这么快,它就像一个符咒。万分感谢。
 sp_mx <- sparse.model.matrix(Var1 ~ Var2 -1 , data = mydata)
model.matrix(~ . + 0, data = df)
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