2016-05-07 4 views
1

にループ動作を最適化私はイベントがすでにそのタイムスタンプによってソートされ、私は生成したいされている以下の形式でR - 長いテーブル形式

 
+-----------+-------+ 
| ProcessId | Event | 
+-----------+-------+ 
|  111 | A  | 
|  111 | B  | 
|  111 | C  | 
|  111 | D  | 
|  111 | E  | 
|  112 | A  | 
|  112 | B  | 
|  112 | D  | 
|  112 | E  | 
|  113 | A  | 
|  113 | B  | 
|  113 | C  | 
|  113 | D  | 
|  113 | E  | 
+-----------+-------+ 

を周りに120万行を含む長い形式のテーブルデータを持っています長形式テーブルから次のような別のテーブルへの別の列への各プロセスidのプロセスフロー文字列

processflow < - ( 'A-> B-> C-> D-> E-' B-> D-> E-、A-> B-> C-> D-> E」など)

私は以下の行を試しましたo fコード。それぞれのi3、4GB RAMラップトップのコアでは、それぞれ約850秒かかります。これをもっと速くする代替手段は何ですか? 任意のガイダンスは

バージョン1 foreachのパッケージに

processflow <- foreach(i=processflow_detection$process_id,.combine='c') %do% state_flow_identifier(i) 

を使用してパッケージを使用してdplyr

state_flow_identifier <- function(x){ 
y <-filter(data_longformat,process_id==x) 
y_v <- as.vector(y$Event) 
as.character(paste(y_v,collapse = '->')) 
} 

processflow_detection <- mutate(processflow_detection,processflow = apply(processflow_detection['process_id'],1,function(x)state_flow_identifier(x))) 

バージョン2のおかげで参考になります。

答えて

1

あなたはdplyrで、このような何かを試すことができますし、それはgroup_by機能です:次のように

library(dplyr) 
df %>% 
    group_by(ProcessId) %>% 
    summarise(eventFlow = paste(Event, collapse = ' -> ')) 

出力は次のようになります。

Source: local data frame [3 x 2] 

    ProcessId    eventFlow 
     (dbl)     (chr) 
1  111 A -> B -> C -> D -> E 
2  112 A -> B -> C -> D -> E 
3  113 A -> B -> C -> D -> E 

注意、あなたのではなかったので、私は、入力として、このデータフレームを使用しましたRに入力する形式で入力します。

df <- data.frame(ProcessId = c(rep(111, 5), rep(112, 5), rep(113, 5)), Event = rep(c('A', 'B', 'C', 'D', 'E'), 3)) 
df 
    ProcessId Event 
1  111  A 
2  111  B 
3  111  C 
4  111  D 
5  111  E 
6  112  A 
7  112  B 
8  112  C 
9  112  D 
10  112  E 
11  113  A 
12  113  B 
13  113  C 
14  113  D 
15  113  E 
+0

ありがとうございます。あなたの答えは、実行時間を10秒未満に短縮するのに役立ちました。 –

0

ライブラリ。

df <- data.frame(ProcessId=c(rep(111,5),rep(112,4),rep(113,5)),Event=unlist(strsplit("ABCDEABDEABCDE",""))) 
len <- nrow(df) 
new_process_id <- c(TRUE, df$ProcessId[-len] != df$ProcessId[-1]) 
sym <- rep(" -> ", len) 
sym[new_process_id] <- "," 
str <- paste(sym, df$Event, sep="", collapse="") 
data.frame(ProcessId=rle(df$ProcessId)$val,EventFlow=unlist(strsplit(str,","))[-1]) 

出力:1.25万ラインのための

ProcessId    EventFlow 
1  111 A -> B -> C -> D -> E 
2  112  A -> B -> D -> E 
3  113 A -> B -> C -> D -> E 

、実行時間は私のラップトップ

+0

彼のコードの実際の除外時間は1秒未満でした。全ETL時間が10秒未満に短縮されました。私の悪い、私は明示的ではありませんでした。しかし、入力のおかげで。 –

2

で約2秒であったまた、Gopalaのデータフレーム@使用(、効率のためにdata.tableをチェックアウトする必要があります)

library(data.table) 
setDT(df)[, .(event_flow = paste(Event, collapse = '->')), by = ProcessId] 
# ProcessId event_flow 
#1:  111 A->B->C->D->E 
#2:  112 A->B->C->D->E 
#3:  113 A->B->C->D->E 
+1

あなたの答えは0.47秒でsystem.timeの出力がありがとう。 @ Gopalaの答えでは、コマンド実行時間は多かれ少なかれ(0.49)でした。私はすでに彼の返事を答えたとマークしています。私はそのように残しています:-)。 –

関連する問題