2016-09-06 3 views
0

Problem: Ich habe zwei Datenrahmen. DF mit Zahlungsprotokoll:So beschleunigen Code mit Schleife in R

Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 53682 obs. of 7 variables: 


str(moneyDB) 
$ user_id : num 59017170 57859746 58507536 59017667 59017795 ... 
$ reg_date: Date, format: "2016-08-06" "2016-07-01" "2016-07-19" ... 
$ date : Date, format: "2016-08-06" "2016-07-01" "2016-07-19" ... 
$ money : num 0.293 0.05 0.03 0.03 7 ... 
$ type : chr "1" "2" "2" "1" ... 
$ quality : chr "VG" "no_quality" "no_quality" "VG" ... 
$ geo  : chr "Canada" "NO GEO" "NO GEO" "Canada" ... 

Hier ist seine Struktur. Es ist nur ein Protokoll aller Transaktionen.

Auch ich hat zweiten Datenrahmen:

str(grPaysDB) 

Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 335591 obs. of 9 variables: 
$ reg_date  : Date, format: "2016-05-01" "2016-05-01" "2016-05-01" ... 
$ date   : Date, format: "2016-05-01" "2016-05-01" "2016-05-01" ... 
$ type   : chr "1" "1" "1" "1" ... 
$ quality  : chr "VG" "VG" "VG" "VG" ... 
$ geo   : chr "Australia" "Canada" "Finland" "Canada" ... 
$ uniqPayers : num 0 1 0 1 1 0 0 1 0 3 ... 

Die gruppierten Daten aus dem ersten Datenrahmen + Null-Transaktionen. Zum Beispiel gibt es viele Zeilen im zweiten Datenrahmen mit nullzahlern. Deshalb ist der zweite Datenrahmen größer als der erste.

Ich muss die Spalte wochentlichePayers zu den zweiten Datenrahmen hinzufügen. Wöchentliche Zahler sind Summe eindeutige Zahler für die letzten 7 Tage. Ich habe es per Loop versucht, aber es war zu lang. Gibt es noch weitere vektorisierte Ideen, wie man das realisiert?

weeklyPayers <- vector() 
for (i in 1:nrow(grPaysDB)) { 
    temp <- moneyDB %>% 
     filter(
     geo == grPaysDB$geo[i], 
     reg_date == grPaysDB$reg_date[i], 
     quality == grPaysDB$quality[i], 
     type == grPaysDB$type[i], 
     between(date, grPaysDB$date[i] - 6, grPaysDB$date[i]) 
    ) 

    weeklyPayers <- c(weeklyPayers, length(unique(temp$user_id))) 
} 
grPaysDB <- cbind(grPaysDB, weeklyPayers) 

für jede Zeile in dieser Schleife i in zweitem Datenrahmen Zeilen in ersten Datenrahmen finden mit rechtem geo, Typ, Qualität und reg_date und Datumsbereich. Und dann kann ich die Anzahl der eindeutigen Zahler berechnen.

+3

Am besten verwenden Sie entweder einen integrierten Datensatz für das Beispiel oder teilen Ihre Daten über 'dput' –

Antwort

0

Ich würde versuchen, einen Beitritt zu Ihren Datensätzen mit merge auf mehrere Spalten (c('geo', 'reg_date', 'quality', 'type') und filtern Sie das Ergebnis basierend auf den Daten. Danach aggregieren mit summarise.

Aber ich bin mir nicht ganz sicher, warum Sie die wöchentlichen payers zu jeder Transaktion hinzufügen möchten. Ist es nicht informativer oder einfacher, Ihre Daten über die Wochennummer zu aggregieren (mit dplyr)? Wie so:

0

Ich mag Missverständnis, aber ich denke, das sollte ziemlich einfach sein, mit Filter und in dplyr zusammenfassen. Wie von @ Hack-R erwähnt, wäre es jedoch hilfreich, wenn Sie Ihren Datensatz haben. Aber es würde ungefähr so ​​aussehen:

library(dplyr) 
weeklyPayers <- grPaysDB %>% 
    filter(date > ADD DATE IN QUESTION) %>% 
    summarise(sumWeeklyPayers = sum(uniqPayers)) 

Dann wieder habe ich vielleicht falsch verstanden. Wenn es sich bei Ihrer Frage um eine Summierung für jede Woche handelt, möchten Sie vielleicht täglich im Paket "timeSeries" zwei Wochen lang untersuchen und dann "group_by" für die wöchentliche Variable verwenden, die sich ergibt.