2015-05-04 2 views
1

У меня есть файл csv, содержащий 2 столбца. В столбце 1 есть имя пользователя и столбец 2, имя пользователя, на которое пользователь ответил. В файле содержится в общей сложности 2 миллиона записей. В Column1 и Column 2. существует около 100K уникальных имен пользователей. Я хочу создать матрицу 100K * 100K, которая даст количество раз, когда каждый пользователь общался с другими 99 999 пользователями. Можно ли создать матрицу в R? Очевидно, что матрица будет очень скудной, по крайней мере, 99,98% матрицы будет нулевой, так как из возможных 10 миллиардов записей всего лишь 2 миллиона записей, что составляет всего 0,02 процента. Как узнать, сколько раз каждый пользователь общался с другими 99,999 пользователями и помещал его в виде матрицы?Создание разреженной матрицы 100K * 100K (10 миллиардов элементов) в R

+0

Вы можете уменьшить вычисление так, Пользователя1: Пользователь2 == Пользователь2: User1 ... То есть, сколько раз User1 пообщалась с Пользователю2 таким же, как число раз Пользователь2 общался с User1. Это правда? – cory

+0

Нет. Я не знаю, сколько раз пользователи общались друг с другом. Я должен найти его, и он определенно не будет таким же, как User1: User2! = User2: User1 – Bruno

+0

Было бы полезно определить «ответ» и «сообщить», а также рассказать нам, как они отличаются, и предоставить некоторые примеры данных , – cory

ответ

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 является один, если я-й пользователь передает j-го пользователя и 0 в противном случае.

Редактировать

Если вы хотите также, чтобы показать, сколько раз общался с J-го I-го пользователя, мы можем обратиться за помощью к 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) 
+0

Спасибо. Если i-й пользователь связывается с j-м пользователем дважды, он будет показывать 2. – Bruno

+0

@Bruno Я сделал редактирование. Посмотрите, помогает ли это. – nicola

+1

У вас есть опечатка на 'col2 = factor (col1, levels = users)', должна быть '(col2, levels ...' Я думаю. – Molx

Смежные вопросы