rowwise operation mit dplyr
Ich arbeite an einem großen Datenrahmen in R von 2,3 Millionen Datensätzen, der Transaktionen von Benutzern an Standorten mit Start- und Stoppzeiten enthält. Mein Ziel ist es, einen neuen Datenrahmen zu erstellen, der die pro Benutzer / pro Standort verbundene Zeit enthält. Nennen wir dies stündlich verbunden.
Transaktion kann zwischen 8 Minuten und 48 Stunden variieren, daher beträgt der Zieldatenrahmen etwa 100 Millionen Datensätze und wächst jeden Monat.
Der Code darunter zeigt, wie der endgültige Datenrahmen entwickelt wird, obwohl der Gesamtcode viel komplexer ist. Das Ausführen des gesamten Codes dauert ca. 9 Stunden auf einer Intel (R) Xeon (R) -CPU E5-2630 v3 bei 2,40 GHz und 16 Kernen und 128 GB RAM.
library(dplyr)
numsessions<-1000000
startdate <-as.POSIXlt(runif(numsessions,1,365*60*60)*24,origin="2015-1-1")
df.Sessions<-data.frame(userID = round(runif(numsessions,1,500)),
postalcode = round(runif(numsessions,1,100)),
daynr = format(startdate,"%w"),
start =startdate ,
end= startdate + runif(1,1,60*60*10)
)
dfhourly.connected <-df.Sessions %>% rowwise %>% do(data.frame(userID=.$userID,
hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
hournr=format(seq(.$start,.$end,by=60*60),"%H")
)
)
Wir möchten diesen Vorgang auf (einige) der 16 Kerne parallelisieren, um den Vorgang zu beschleunigen. Ein erster Versuch war die Verwendung desmultidplyr
package. Die Partition basiert aufdaynr
df.hourlyconnected<-df.Sessions %>%
partition(daynr,cluster=init_cluster(6)) %>%
rowwise %>% do(data.frame(userID=.$userID,
hourlydate=as.Date(seq(.$start,.$end,by=60*60)),
hournr=format(seq(.$start,.$end,by=60*60),"%H")
)
) %>% collect()
Jetzt dierowwise
ie @ -Funktion scheint einen Datenrahmen als Eingabe anstelle einer Partition zu erfordern.
Gibt es eine Problemumgehung, um eine zeilenweise Berechnung für Partitionen pro Kern durchzuführen?
Hat jemand einen Vorschlag, diese Berechnung mit einem anderen R-Paket und anderen Methoden durchzuführen?