创建一个稀疏矩阵;给定非零元素的索引,用于创建大型数据集的分类列的虚拟变量
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
我正在尝试使用稀疏矩阵为具有 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