2017-03-05 19 views
1

IDが "type = B"の日付以降に発生する各IDの日付に基づいてすべての行を削除しようとしています。R - 条件付き日付の後に行を削除/削除する(複数の条件)

私は配列検索ヘルパー列を使って削除するフラグを設定します。 Rでこれを行うにきれいな方法がありますか?

最小例:このResultに

library(data.table) 

#input 
colNames<-c("id","date","type") 
df2 <- data.table(c("010","010","010", "010","030","210","310"), 
        as.Date(c("2009-08-21","2012-12-28","2014-01-01","2011-07-05","2015-04-05","2013-07-05","2012-08-01")), 
        c("A", "B","A","A", "A", "B", "B") 
       ) 
df2<-df2[order(df2$V1, as.Date(df2$V2, format="%y/%m/%d")),] 
names(df2) <- colNames 
df2 

    id  date type 
1: 010 2009-08-21 A 
2: 010 2011-07-05 A 
3: 010 2012-12-28 B 
4: 010 2014-01-01 A 
5: 030 2015-04-05 A 
6: 210 2013-07-05 B 
7: 310 2012-08-01 B 

#output 
    V1   V2 V3 
1: 010 2009-08-21 A 
2: 010 2011-07-05 A 
3: 030 2015-04-05 A 

ありがとう!あなたが最初のBのインデックスを見つけるとheadとインデックスの前の行を取るためにmatchを使用することができます

答えて

2

:見つかりませ Bが存在しない場合は、すべての行が( 日の手の前に列によって注文されたデータテーブルを想定して)あなたが必要なものを与える必要があり、グループ内の行数になるように nomatchを指定して、返されるべき
df2[, head(.SD, match("B", type, nomatch = .N+1) - 1), id] 

# id  date type 
#1: 010 2009-08-21 A 
#2: 010 2011-07-05 A 
#3: 030 2015-04-05 A 

それとも、より効率的であることを、あなたは中間データテーブル(.SD)の構築を避けるために、この代替手段を使用することができます。

df2[df2[, head(.I, match("B", type, nomatch = .N+1) - 1), id]$V1] 
関連する問題