在R中创建一个100K * 100K(100亿元素)稀疏矩阵

时间:2015-05-04 15:37:36

标签: r matrix username elements sparse-matrix

我有一个包含2列的csv文件.Column 1有用户名,第2列是用户回复的用户名。文件中总共有200万条记录。 Column1和Column 2中有大约100K的唯一用户名。我想创建一个100K * 100K矩阵,它将给出每个用户与其他99,999个用户通信的次数。是否可以在R中创建矩阵?显然,矩阵将非常稀疏,至少99.98%的矩阵为零,因为在可能的100亿中只有200万个记录,仅为0.02%。如何找到每个用户与其他99,999个用户通信的次数并将其以矩阵的形式表示?

1 个答案:

答案 0 :(得分:3)

您可以使用sparseMatrix包中的Matrix

 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)