2016-10-02 3 views
1

Beispiel an diesem Punkt in meinem Code:verschachtelte ifelse Anweisung beschleunigen - R

time_elapsed      network_name    daypart  day 
1:   4705       Laff TV 2016-09-09 03:11:35 Friday 
2:   1800        CNN 2016-09-10 08:00:00 Saturday 
3:   23        INSP 2016-09-02 18:00:00 Friday 
4:   148        NBC 2016-09-02 16:01:26 Friday 
5:   957     History Channel 2016-09-07 14:44:03 Wednesday 
6:   1138   Nickelodeon/Nick-at-Nite 2016-09-09 16:00:00 Friday 
7:   120      Starz Edge 2016-09-07 15:28:59 Wednesday 
8:   268   Starz Encore Westerns 2016-09-07 17:13:05 Wednesday 
9:   6        CBS 2016-09-10 04:00:00 Saturday 
10:   69      Independent 2016-09-07 12:48:11 Wednesday 
11:   4151        NBC 2016-09-09 04:32:37 Friday 
12:   570 PBS: Public Broadcasting Service 2016-09-07 16:17:58 Wednesday 
13:   1421       NBCSN 2016-09-03 15:22:23 Saturday 
14:   466   Estrella TV (Broadcast) 2016-09-04 19:00:00 Sunday 

(im Allgemeinen mehr als 200 Millionen Zeilen)

Ich schrieb die folgende verschachtelte ifelse Aussage vor ein paar Monaten, als ich Ich liefere mein gesamtes Skript über nur ein paar Millionen Zeilen, aber jetzt, wo ich es in größerem Umfang benutze, würde ich wirklich gerne einen Weg finden, es ein wenig schneller zu machen.

Ich habe versucht, eine data.table Lösung zu verwenden, aber war nur sehr wenig schneller und verwandelte meine data.table in eine Liste. Für das Leben von mir konnte ich nicht sehen warum. Das hinzugefügt genug Zeit, um es rückgängig zu machen, war nicht die Ersparnisse wert.

Alle Vorschläge würden sehr geschätzt werden. Was ich habe funktioniert und wenn ich dabei bleiben muss, wird es in Ordnung sein. Es dauert derzeit etwa 3,5 Stunden, um den vollständigen Code zu durchlaufen. Der größte Teil ist eine SQL-Abfrage und die Dateierstellung der Ergebnisse, aber es wäre schön, wenn ich so viel Zeit wie möglich abräumen könnte!

(As Nebenbei bemerkt - es verwendet fast 8 Stunden dauern, bis ich Tonnen Teile mit data.table Syntax ersetzt ich jetzt eine offizielle Fan bin.!)

+0

Sie könnten parLapply verwenden, um mehrere Zeilen gleichzeitig auszuführen – Rilcon42

+0

Siehe '? Cut'. Es scheint, dass Sie etwas wie 'cut (targets_random $ daypart $ hour, c (-Inf, 3, 6, 10, 17, 21, Inf), include.lowest = TRUE, right = FALSE) 'aber die Änderung der" Labels "Argument mit' c ("LP: Late Prime", "O: Overnight", etc ...) 'und danach mit' "W: Weekend" 'wo auch immer ersetzen (targets_random $ daypart $ wday + 1)% in% c (1, 7) ' –

Antwort

0

Betrachten Sie eine separate, statische Tageszeiten Gebäude Datenrahmen aller möglichen Kombinationen und deren Ergebnis. In der SQL-Praxis würde dies als Nachschlagetabelle betrachtet werden. Dann fusionieren Sie routinemäßig mit der vollständigen Datentabelle.

# DF (N=168) 7 X 24 
daytimes <- expand.grid(wday=c(1:7), 
         hour=c(1:24))  
daytimes$result <- 
    ifelse((daytimes$wday == 1|daytimes$wday == 7), "W: Weekend", 
     ifelse(daytimes$hour <= 2, "LP: Late Prime", 
      ifelse((daytimes$hour >= 3 & daytimes$hour <= 5), "O: Overnight", 
        ifelse((daytimes$hour >= 6 & daytimes$hour <= 9), "EM: Early Morning", 
          ifelse((daytimes$hour >= 10 & daytimes$hour <= 16), "D: Day", 
            ifelse((daytimes$hour >= 17 & daytimes$hour <= 20), "F: Fringe", 
             ifelse(daytimes$hour >= 21, "P: Prime", NA))))))) 
# CREATE MERGE FIELDS 
targets_random$wday <- wday(targets_random$daypart) 
targets_random$hour <- hour(targets_random$daypart) 

# MERGE WITH NEW COLUMN: result 
targets_random <- merge(targets_random, daytimes, by=c("wday", "hour"))   
+0

Ohhhh, ich werde es versuchen! – Camille