有条件地从数据框中删除行(多个条件)

ECI*_*CII 6 conditional r dataframe

我已经搜索了SO,虽然有很多关于有条件删除行的QA但没有QA适合我的问题.

我有一个data.frame可变的含纵向测量x,y...,在各个时间点等time,在若干受试者id.一些受试者经历事件ev(表示为1,否则0在某些情况下time).我想将初始值减少data.frame到:

  • 1)所有具有未经历过事件的主题的行(好的,那很容易)但也包括
  • 2)对于经历过事件的主体,事件之前的所有行(即所有行的次数都少于该个体事件发生的时间).

以便,

testdf<-data.frame(id=c(rep("A",4),rep("B",4),rep("C",4) ),
                   x=c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5), 
                   y=rev(c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5)),
                   time=c(1,2,3,4,0.1,0.5,10,20,3,2,1,0.5),
                   ev=c(0,0,0,0,0,1,0,0,0,0,0,1))
Run Code Online (Sandbox Code Playgroud)

会减少到

   id  x  y time ev
1   A NA  5  1.0  0
2   A NA NA  2.0  0
3   A  1 NA  3.0  0
4   A  2  2  4.0  0
5   B  3  1  0.1  0
6   C  2  2  3.0  0
7   C NA  1  2.0  0
8   C NA NA  1.0  0
Run Code Online (Sandbox Code Playgroud)

Sve*_*ein 4

这是一个使用subsetand的解决方案ave

subset(testdf, !ave(ev, id, FUN = cumsum))
Run Code Online (Sandbox Code Playgroud)