在 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 包寻求帮助。在创建 col1col2 之后:

  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)