我正在尝试使用稀疏矩阵为一组包含 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() 将这些变量设置为因子。