Hier sind einige Variablen, in erster Linie aus Gründen der Klarheit, aber im Fall von pv_code
einen Anruf aus einer Iteration Hissen so dass es einmal durchgeführt wird statt 100 von Zeiten.
pv_url <- pagesVisited[, 11]
pv_code <- sub("ic=", "", pagesVisited$evar3)
pv_click <- pagesVisited[, 3]
Jede besuchte Seite gehört zu einer Gruppe
grp <- match(pv_url, URLSMMG$URLWithoutParameters)
Wir dies ein Faktor machen, und beinhalten alle URLWithoutParameters als Ebenen. Dies macht den Code robust URLs, die erscheinen nicht in pv_url
grp <- factor(grp, levels=seq_len(nrow(URLSMMG)))
Wir in einigen Zeilen nur interessiert sind
keep <- pv_code == URLSMMG$Code[grp]
Wir würden jetzt gerne pv_click
und Summe von Gruppe filtern
(die entsprechende Zeile im ursprünglichen Code URLSMMG$pageviewsMMGClick[i] <- ...
kopiert den gesamten Datumsrahmen jedes Mal, wenn ein Zeilenelement aktualisiert wird, a nd ist sehr ineffizient; Es wäre besser, eine temporäre Variable click = integer(nrow(URLSMMG)
vorzubelegen, während der Schleife click[i] <- ...
zu füllen und URLSMMG einmal am Ende zu aktualisieren, oder einfach sapply()
zu verwenden, anstatt sich über die Vorbelegung von Anzeigen zu sorgen.
Als Funktion haben wir
fun <- function(url, url_code, pv_url, pv_code, pv_click) {
stopifnot(!any(duplicated(url)))
grp <- factor(match(pv_url, url), levels=seq_along(url))
keep <- pv_code == url_code[grp]
unname(sapply(split(pv_click[keep], grp[keep]), sum))
}
Hier ist ein kurzer Test für Richtigkeit
url <- c("A", "B", "C")
url_code <- c(1, 1, 1)
pv_url <- c("A", "A", "A", "C")
pv_code <- c(1, 1, 2, 1)
pv_click <- c(5, 6, 7, 8)
mit Ausgang
> fun(url, url_code, pv_url, pv_code, pv_click)
[1] 11 0 8
Für Leistung, hier Daten von der gleichen Größe wie in der ursprüngliche Frage
url <- as.character(1:374)
url_code <- sample(3, 374, TRUE)
pv_url <- sample(url, 99120, TRUE)
pv_code <- sample(url_code, 99120, TRUE)
pv_click <- rep(1, 99120)
und das Timing
> system.time(xx <- fun(url, url_code, pv_url, pv_code, pv_click))
user system elapsed
0.036 0.000 0.035
Diese im Vergleich zum Original ein 10000X Beschleunigungs zu sein scheint.
Thx! Ich versuche es gerade jetzt mit einem neuen Datenrahmen, denn in den vorherigen Versuchen war die Leistung nicht viel besser (weit weg von Ihrer 30-60s Schätzung). Die Daten stammen von einem Aufruf an die Adobe Analytics-API. Es kann also etwa 10 Minuten dauern, bis Sie kommen. Ich antworte in Ihrer Antwort, sobald die Ausführungszeit angezeigt wird – agustin
Alle Werte sind einzigartig :(, also keine Leistung mit diesem Ansatz – agustin
Ist es machbar, den relevanten Teil nach '" ic = "' aus 'evar3' zu extrahieren eine eigene Variable in 'pagesVisited' oder ist die' grepl' hier wirklich notwendig? –