2017-09-19 10 views
2

ich eine sehr große Sparse Matrix haben, die wie folgt aussieht: aufeine spärliche Matrix durch eine einzige Säule Aggregieren

client item_1 item_2 item_3.... item_n 
    a  1  0  0   0 
    a  0  0  1   0 
    b  0  1  0   0 
    b  1  0  0   0 

und so ...

Ich möchte die Matrix durch die Client-Spalte aggregieren zu erhalten:

client item_1 item_2 item_3.... item_n 
    a  1  0  1   0 
    b  1  1  0   0 

habe ich versucht, zurück in eine dichte Matrix zu konvertieren und dann Aggregat, aber in den Speicher Probleme laufen.

Aussehen Meine Daten wie

new("dgCMatrix" 
    , i = c(0L, 1L, 2L, 3L, 0L, 3L, 2L, 1L) 
    , p = c(0L, 4L, 6L, 7L, 8L, 8L) 
    , Dim = 4:5 
    , Dimnames = list(NULL, c("client", "item_1", "item_2", "item_3", "item_n" 
)) 
    , x = c(1, 1, 2, 2, 1, 1, 1, 1) 
    , factors = list() 
) 
+1

Versuchen Sie 'aggregate (. ~ Client, df1, sum)' – akrun

+0

oder .. 'mit (d, rowsum (d [-1], Client))'. Aber kannst du bitte etwas klarer über deine Struktur sein? Ist es tatsächlich ein SparseMatrix-Klassenobjekt, da afaik keine Zeichenvariablen haben können – user20650

+0

Ja, es ist eine SparseMatrix, also sind die Clientvariablen 1,2,3 statt a, b, c. Aggregat (. ~ Client, DF1, Summe) funktioniert nicht, weil es eine SparseMatrix ist. – deadasdreams

Antwort

0

Sie data.table Paket benötigen geladen, dies zu tun, aber da Sie sagte, dass es eine sehr große Matrix ist, ist eine gute Idee data.table

unter der Annahme haben, um Ihre Matrix ist b, Sie tun können:

library(data.table) 
setDT(b) 
b[,lapply(.SD, sum), by = "client"] 

Wenn Sie nur einige Spalten summiert benötigen, dann Nachschlag die .SDcols Argument in der Paketdokumentation, ?data.table.

Verwandte Themen