は次のように我々は、データ・セットがあるとし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
右。それは彼らのデータでそれをテストし、正しい結果を得たが、何とかそれを逃した。アルファベット順が使用されるので、それはまだ動作します。 – Axeman
はい、優秀です。ありがとう。私は 'which.min'が最初の価値を取ることを忘れる傾向があります。 – Axeman
私の更新が表示されます。 – John