2017-03-05 111 views
1

我試圖刪除所有行,這是基於每個ID在ID有「type = B」日期或之後發生的日期。R - 在條件日期(多個條件)後刪除/刪除行

在Excel中,我會用數組搜索助手列來標記要刪除的標記。在R中有更清晰的方法嗎?

小例子:

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 

謝謝!

回答

2

您可以使用match找出第一個B的索引,並將索引之前的行與head;如果沒有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]