2016-10-02 11 views
1

例私のコードでは、この時点では:私がいたときネストされたifelse文のスピードアップ - 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 

(一般的に200以上の万行)

を私は数ヶ月前に、次のネストされたifelse文を書きました私のスクリプト全体を数百万行に渡って実行していますが、今はもっと大きな規模で実行しています。私は本当にそれを少し速くする方法を見つけたいと思います。

targets_random$daypart <- ifelse((wday(targets_random$daypart) == 1 | 
       wday(targets_random$daypart) == 7), "W: Weekend", 
         ifelse(hour(targets_random$daypart) <= 2, "LP: Late Prime", 
         ifelse((hour(targets_random$daypart) >= 3 & 
       hour(targets_random$daypart) <= 5), "O: Overnight", 
         ifelse((hour(targets_random$daypart) >= 6 & 
       hour(targets_random$daypart) <= 9), "EM: Early Morning", 
         ifelse((hour(targets_random$daypart) >= 10 & 
       hour(targets_random$daypart) <= 16), "D: Day", 
         ifelse((hour(targets_random$daypart) >= 17 & 
       hour(targets_random$daypart) <= 20), "F: Fringe", 
         ifelse(hour(targets_random$daypart) >= 21, "P: Prime", NA))))))) 

私はdata.tableソリューションを使ってみましたが、ほんの少し速くて、自分のdata.tableをリストに変換しました。私の人生のために、私は理由を見ることができませんでした。これを元に戻すのに十分な時間を追加しても、それは節約に値するものではありません

ご提案いただければ幸いです。私が働いていること、それに固執しなければならないなら、それはうまくいくでしょう。現在、完全なコードを実行するのに約3.5時間かかります。最大の部分はSQLクエリと結果のファイル作成ですが、可能な限り多くの時間を削ることができればいいと思います!

(追記として - 。!それは私がdata.table構文で部品のトンを交換し、ほぼ8時間前にするために使用私は今、公式ファンだ)

+0

parLapplyを使用してマルチプル行を一度に実行できるかもしれません。 – Rilcon42

+0

'?cut'を参照してください。あなたは 'cut(targets_random $ daypart $ hour、c(-Inf、3、6、10、17、21、Inf)、include.lowest = TRUE、right = FALSE)のようなものを使うことができますが、 '' W:Weekend '''どこでも '(targets_random $ daypart $ wday + 1)%で置き換えて、' 'label'引数を' 'LP:Late Prime ''、 'O:Overnight' %c(1,7) ' –

答えて

0

は別の、静的daytimesの構築を考えてみましょうすべての可能な組み合わせのデータフレームとその結果SQLのプラクティスでは、これはルックアップテーブルと見なされます。次に、完全なデータテーブルと定期的にマージします。

# 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

ああ私はそれを試みるつもりです! – Camille

関連する問題