2017-02-23 12 views
-1

Ich habe eine riesige Datentabelle mit Millionen von Zeilen und Dutzende Spalten, so dass die Leistung ein entscheidendes Thema für mich ist. Die Daten beschreiben Besuche einer Inhaltsseite. Ich möchte die ContentId des frühesten Treffers (d. H. Mindesttrefferzeit) jedes Besuchs berechnen. Was ich getan habe ist: dt[,.(FirstContentOfVisit=ContentID[ContentID != ""][which.min(HitTime)]), by=VisitId,.SDcols=c("ContentID","HitTime")]So filtern Sie eine Spalte basierend auf einer Bedingung aus einer anderen Spalte in R

das Problem ist, dass ich weiß nicht, ob which.min berechnet zuerst die min auf dem alle HitTime Vektor (was ich will nicht!) Oder tut er nur auf dem gefilterten HitTime Vektor (derjenige, der der nicht leeren ContentID entspricht).

Zusätzlich, nachdem ich es berechnet habe - wie kann ich die minimale HitTime der ContentIDs erhalten, die sich von der ersten unterscheiden (d. H. Die früheste Trefferzeit der nicht-ersten Inhalts-ID).

Wenn ich versuchte, beide Aktionen mit benutzerdefinierten Funktionen zu haben (zuerst - die Unterdatentabelle sortieren und dann den gewünschten Wert extrahieren), dauerte es ewig (und tatsächlich nie aufgehört), obwohl ich eine sehr starke Maschine (virtuell) mit 180 GB RAM. Also ich suche eine Inline-Lösung.

Antwort

0

dplyr macht dies viel einfacher. Sie haben keine Probe Ihrer Daten geteilt, aber ich nehme an, die Variablen von Interesse sehen in etwa so aus.

web <- tibble(
    HitTime = sample(seq(as.Date('2010/01/01'), as.Date('2017/02/23'), by="day"), 1000), 
    ContentID = 1:1000, 
    SessionID = sample(1:100, 1000, replace = TRUE) 
) 

Dann können Sie einfach group_by und summarise verwenden Sie den frühesten Wert von HitTime für jeden SessionID zu finden.

web %>% 
    group_by(SessionID) %>% 
    summarise(HitTime = min(HitTime)) 
Verwandte Themen