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.
Am besten verwenden Sie entweder einen integrierten Datensatz für das Beispiel oder teilen Ihre Daten über 'dput' –