2016-07-08 9 views
1

は次のように我々は、データ・セットがあるとしRどのようdata.table使用して集約に必要な行を取得し、dplyr

特定DRIVE_NUM基について

DRIVE_NUM基で任意FAILフラグがあれば、私は失敗フラグを最初の行 したいです。

グループにFAILフラグがない場合は、 グループの最初の行を取ります。だから、

、私は次のセットを取得しなければならない。今、私はddply使用してそれを行うことができ

wanted = data.frame(
    ID = c(2,4,8), 
    DRIVE_NUM = c("A","B","C"), 
    FLAG = c("FAIL","PASS","FAIL") 
) 

    ID DRIVE_NUM FLAG 
    2   A FAIL 
    4   B PASS 
    8   C FAIL 

を私のデータセットは、通常は非常に大きいので、それは非常に遅いです。

data.tableまたはdplyrを使用する方法はありますか。


更新:

dplyrがplyrよりもさらに遅くなると思われます。 plyrより速く何かをする方法はありますか?それとも、私は不適当に何かを使用していますか?

#Simulate Data 

X = data.frame(
    group = rep(paste0("NO",1:10000),each=2), 
    flag = sample(c("F","P"),20000,replace = TRUE), 
    var = rnorm(20000) 
) 



library(plyr) 
library(dplyr) 

#plyr 

START = proc.time() 
X2 = ddply(X,.(flag),function(df) { 
    if(sum(df$flag=="F")> 0){ 
    R = df[df$flag=="F",] 
    if(nrow(R)>1) {R = R[1,]} else {R = R} 
    } else{ 
    R = df[1,] 
    } 
    R 
}) 
proc.time() - START 

#user system elapsed 
#0.03 0.00 0.03 

#dplyr method 1 

START = proc.time() 
X %>% 
    group_by(group) %>% 
    slice(which.min(flag)) 
proc.time() - START 

#user system elapsed 
#0.22 0.02 0.23 

#dplyr method 2 

START = proc.time() 
X %>% 
    group_by(group, flag) %>% 
    slice(1) %>% 
    group_by(group) %>% 
    slice(which.min(flag)) 
proc.time() - START 

#user system elapsed 
#0.28 0.00 0.28 

答えて

2

我々は唯一のこれまで各DRIVE_NUMための最初の行たいので:FLAG組み合わせを、我々はgroup_bysliceを使用してのみ最初の行を選択して起動します。次にFLAGで整理することを確認します。したがって、FAILがある場合、それはDRIVE_NUMの最上列になりますが、PASSしかない場合は何も変わりません。その後、再び最上部の行を選択するためにsliceとなります。

library(dplyr) 
X %>% 
    group_by(DRIVE_NUM, FLAG) %>% 
    slice(1) %>% 
    group_by(DRIVE_NUM) %>% 
    slice(which.min(FLAG)) 

@Frankは、基本的に第1の値(第1行)をとるwhich.minに依存する、はるかに短く、これを解決しました。

X %>% 
    group_by(DRIVE_NUM) %>% 
    slice(which.min(FLAG)) 
+0

右。それは彼らのデータでそれをテストし、正しい結果を得たが、何とかそれを逃した。アルファベット順が使用されるので、それはまだ動作します。 – Axeman

+1

はい、優秀です。ありがとう。私は 'which.min'が最初の価値を取ることを忘れる傾向があります。 – Axeman

+0

私の更新が表示されます。 – John

関連する問題