2017-03-05 81 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]