在 R 中创建一个 100K*100K(100 亿个元素)的稀疏矩阵
Creating a 100K*100K (10 billion element) sparse matrix in R
我有一个包含 2 列的 csv 文件。第 1 列是用户名,第 2 列是用户回复的用户名。文件中共有200万条记录。 Column1 和 Column 2 中大约有 100K 个唯一用户名。我想创建一个 100K*100K 矩阵,给出每个用户与其他 99,999 名用户交流的次数。是否可以在 R 中创建矩阵?显然矩阵将非常稀疏,至少 99.98% 的矩阵为零,因为在可能的 100 亿条记录中只有 200 万条记录仅为 0.02%。如何找到每个用户与其他 99,999 个用户通信的次数并以矩阵的形式表示?
您可以使用 Matrix
包中的 sparseMatrix
:
require(Matrix)
#this just to generate some random strings
require(stringi)
set.seed(1)
#generating 100k usernames
users<-stri_rand_strings(100000,6)
#simulating col1 and col2
col1<-sample(users,1000000,T)
col2<-sample(users,1000000,T)
#hashing to integer values through factor
col1<-factor(col1,levels=users)
col2<-factor(col2,levels=users)
#creating the matrix
mySparseMatrix<-sparseMatrix(as.numeric(col1),as.numeric(col2),x=1)
#not a huge object
object.size(mySparseMatrix)
#12400720 bytes
通过这种方式,您可以创建一个 sparseMatrix
,如果第 i 个用户与第 j 个用户通信,则其 i,j
值为 1,否则为 0。
编辑
如果您还想显示第 i 个用户与第 j 个用户通信的次数,我们可以向 data.table
包寻求帮助。在创建 col1
和 col2
之后:
require(data.table)
dt<-data.table(col1=factor(col1,levels=users),col2=factor(col2,levels=users))
#aggregating by col1 and col2
dt<-dt[,list(times=.N),by=list(col1,col2)]
mySparseMatrix<-sparseMatrix(as.numeric(dt$col1),as.numeric(dt$col2),x=dt$times)
我有一个包含 2 列的 csv 文件。第 1 列是用户名,第 2 列是用户回复的用户名。文件中共有200万条记录。 Column1 和 Column 2 中大约有 100K 个唯一用户名。我想创建一个 100K*100K 矩阵,给出每个用户与其他 99,999 名用户交流的次数。是否可以在 R 中创建矩阵?显然矩阵将非常稀疏,至少 99.98% 的矩阵为零,因为在可能的 100 亿条记录中只有 200 万条记录仅为 0.02%。如何找到每个用户与其他 99,999 个用户通信的次数并以矩阵的形式表示?
您可以使用 Matrix
包中的 sparseMatrix
:
require(Matrix)
#this just to generate some random strings
require(stringi)
set.seed(1)
#generating 100k usernames
users<-stri_rand_strings(100000,6)
#simulating col1 and col2
col1<-sample(users,1000000,T)
col2<-sample(users,1000000,T)
#hashing to integer values through factor
col1<-factor(col1,levels=users)
col2<-factor(col2,levels=users)
#creating the matrix
mySparseMatrix<-sparseMatrix(as.numeric(col1),as.numeric(col2),x=1)
#not a huge object
object.size(mySparseMatrix)
#12400720 bytes
通过这种方式,您可以创建一个 sparseMatrix
,如果第 i 个用户与第 j 个用户通信,则其 i,j
值为 1,否则为 0。
编辑
如果您还想显示第 i 个用户与第 j 个用户通信的次数,我们可以向 data.table
包寻求帮助。在创建 col1
和 col2
之后:
require(data.table)
dt<-data.table(col1=factor(col1,levels=users),col2=factor(col2,levels=users))
#aggregating by col1 and col2
dt<-dt[,list(times=.N),by=list(col1,col2)]
mySparseMatrix<-sparseMatrix(as.numeric(dt$col1),as.numeric(dt$col2),x=dt$times)