2017-09-28 6 views
0

私はmem_ord(74個の変数の1561464ods)を持っています。 SITE_JOIN_DATEは日付タイプであり、SITE_JOIN_DATEは条件に従ってユーザータイプを分割しようとしています。しかし、結果を見るには遅すぎました。 if条件が遅すぎます。どうすればスピードを上げることができますか?私はまた、複数のコアを使用することができます。rのデータテーブルの文を高速化

mem_ord_by_user <- mem_ord[, list(
     AF_SITE_JOIN_DT = Sys.Date() - SITE_JOIN_DATE, 
     DAY_PAY_CNT = .N, 
     DAY_TOT_PRICE = .SD[, sum(TOT_PAY_PRICE)], 
     USER_TYPE = .SD[ 
     ,if(SITE_JOIN_DATE > '2017-07-17' && SITE_JOIN_DATE < '2017-08-05' && !is.na(SITE_JOIN_DATE)){ 
      'event_joiner' 
     }else if((SITE_JOIN_DATE <= '2017-07-17' || SITE_JOIN_DATE >= '2017-08-05') && !is.na(SITE_JOIN_DATE)){ 
      'no_event_joiner' 
     }else{ 
      'null_user' 
     }] 
    ), 
    by=list(ORD_DT, CUSTOMER_NUM), 
    .SDcols = c('TOT_PAY_PRICE', 'SITE_JOIN_DATE')] 
+0

mem_ordのキー値は setkeyv(mem_ord、C( 'ORD_DT'、 'C​​USTOMER_NUM'))です。 これも変更できます。 –

+0

サンプルデータを提供できますか? – minem

+0

'if()... else if()'の代わりに 'ifelse()'ネストした構造を使用した場合、速度を速くすることはできますか? – LAP

答えて

0

このようなものが欲しいですか?

require(data.table) 
N <- 10 
dateSeq <- seq(as.Date('2017/07/01'), Sys.Date(), by="day") 
set.seed(120) 
mem_ord <- data.table(SITE_JOIN_DATE = sample(dateSeq, N, replace=T), 
         TOT_PAY_PRICE = rnorm(N), 
         ORD_DT = sample(dateSeq, N, replace=T), 
         CUSTOMER_NUM = sample(1:1000, N, replace=T)) 

mem_ord[sample(1:.N, 2), SITE_JOIN_DATE := NA] 
mem_ord 
# SITE_JOIN_DATE TOT_PAY_PRICE  ORD_DT CUSTOMER_NUM 
# 1:  2017-08-05 0.22596353 2017-07-14   975 
# 2:   <NA> -0.90504565 2017-08-17   124 
# 3:  2017-08-01 1.70870936 2017-09-25   382 
# 4:  2017-09-10 0.09849052 2017-09-22   890 
# 5:  2017-07-18 0.79617909 2017-08-02   499 
# 6:   <NA> 0.38020124 2017-08-06   902 
# 7:  2017-09-27 0.46077825 2017-09-09   367 
# 8:  2017-07-09 0.49886281 2017-08-08   907 
# 9:  2017-09-15 -1.35021861 2017-07-18   906 
# 10:  2017-09-21 -0.53256174 2017-09-01   560 

d1 <- as.Date('2017-07-17') 
d2 <- as.Date('2017-08-05') 
mem_ord[, USER_TYPE := ifelse(SITE_JOIN_DATE > d1 & SITE_JOIN_DATE < d2, 
           "event_joiner", "no_event_joiner")] 
mem_ord[is.na(USER_TYPE), USER_TYPE := "null_user"] 
mem_ord[, .N ,keyby = USER_TYPE] 
#   USER_TYPE N 
# 1: event_joiner 2 
# 2: no_event_joiner 6 
# 3:  null_user 2 

mem_ord_by_user <- mem_ord[, list(
    AF_SITE_JOIN_DT = Sys.Date() - SITE_JOIN_DATE, 
    DAY_PAY_CNT = .N, 
    DAY_TOT_PRICE = sum(TOT_PAY_PRICE), 
    USER_TYPE = USER_TYPE), 
by=list(ORD_DT, CUSTOMER_NUM, SITE_JOIN_DATE)] 

mem_ord_by_user 
# ORD_DT CUSTOMER_NUM SITE_JOIN_DATE AF_SITE_JOIN_DT DAY_PAY_CNT DAY_TOT_PRICE  USER_TYPE 
# 1: 2017-07-14   975  2017-08-05   54 days   1 0.22596353 no_event_joiner 
# 2: 2017-08-17   124   <NA>   NA days   1 -0.90504565  null_user 
# 3: 2017-09-25   382  2017-08-01   58 days   1 1.70870936 event_joiner 
# 4: 2017-09-22   890  2017-09-10   18 days   1 0.09849052 no_event_joiner 
# 5: 2017-08-02   499  2017-07-18   72 days   1 0.79617909 event_joiner 
# 6: 2017-08-06   902   <NA>   NA days   1 0.38020124  null_user 
# 7: 2017-09-09   367  2017-09-27   1 days   1 0.46077825 no_event_joiner 
# 8: 2017-08-08   907  2017-07-09   81 days   1 0.49886281 no_event_joiner 
# 9: 2017-07-18   906  2017-09-15   13 days   1 -1.35021861 no_event_joiner 
10: 2017-09-01   560  2017-09-21   7 days   1 -0.53256174 no_event_joiner 
+0

ありがとうございます。私はデータテーブルの:=メソッドについて心配していましたが、何をすべきか分かりませんでした。上記のように、スピードははるかに速いです。 –