R 创建稀疏矩阵;给定用于创建大型数据集分类列的虚拟变量的非零元素索引
我试图使用稀疏矩阵为一组包含580万行和两个分类列的数据生成虚拟变量 数据结构如下: mydata:data.table包含5800000行和两个分类(整数格式)变量Var1和Var2 NLLevel(Var1):210000(级别包括1到210000之间的所有数字) nlevel(Var2):500(级别包括1到500之间的所有数字) 下面是mydata的一个示例: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
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