排除R中特定行下面的所有记录

use*_*292 2 r

我的数据包含三个变量,其中包含三个唯一ID,每个变量都有多个记录.见下文

ID <- c(rep(1,7), rep(2,6), rep(3,5), rep(4,6))
t <- c(seq(1,7), seq(1,6), seq(1,5), rep(2,6))
y <- c(rep(6,7), rep(1,6), rep(6,5), rep(0.2,6))
z <- c(5,0,0,0,1,0,0,0,0,-1,0,0,0,4,2,NaN,0,1,0,0,1,Inf,Inf, Inf)
dat1 <- data.frame(ID, t, y, z)
Run Code Online (Sandbox Code Playgroud)

对于每个ID,如果z的值低于0(负),NaN,Inf或-Inf,我需要排除该记录及其下面的所有记录.

对于此数据,新处理的数据如下所示:

ID <- c(rep(1,7), rep(2,2), rep(3,2), rep(4,3))
t <- c(seq(1,7), seq(1,2), seq(1,2), rep(2,3))
y <- c(rep(6,7), rep(1,2), rep(6,2), rep(0.2,3))
z <- c(5,0,0,0,1,0,0,0,0,4,2,0,0,1)
dat2 <- data.frame(ID, t, y, z)
Run Code Online (Sandbox Code Playgroud)

the*_*ail 6

ave,作为一组替代.使用cumsum计数器然后标识任何后续行以进行删除:

dat1[with(dat1, ave(z < 0 | (!is.finite(z)), ID, FUN=cumsum) == 0),]
Run Code Online (Sandbox Code Playgroud)

快速检查以查看它们是否匹配,但rownames除外排列:

all.equal(
  dat2,
  dat1[with(dat1, ave(z < 0 | (!is.finite(z)), ID, FUN=cumsum) == 0),],
  check.attributes=FALSE
)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)