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