我让不同的人进行了测试,并分配了一个测试编号,以形成一个范围从 0 到 3 的序列。例如:
ID Nb_Test
A1 0
A1 1
A1 2
A2 1
A2 2
A2 3
A3 0
A3 1
A3 3
如何删除没有测试 #0 的每个人的测试以及序列中断后的测试。例如,我希望它看起来像这样:
ID Nb_Test
A1 0
A1 1
A1 2
A3 0
A3 1
最佳答案
有几种可能性,都依赖于相同的两个逻辑检查:对于组中的 0
any
位置,以及 diff
>序列中的erence是1
。
基础R
dat[as.logical(ave(dat$Nb_Test, dat$ID, FUN=\(x) any(x==0) & c(TRUE, diff(x) == 1))),]
# ID Nb_Test
#1 A1 0
#2 A1 1
#3 A1 2
#7 A3 0
#8 A3 1
数据表
library(data.table)
setDT(dat)
dat[, if(any(Nb_Test==0)) .SD[c(TRUE, diff(Nb_Test) == 1)], by=ID]
# ID Nb_Test
#1: A1 0
#2: A1 1
#3: A1 2
#4: A3 0
#5: A3 1
dplyr
library(dplyr)
dat %>%
group_by(ID) %>%
filter(any(Nb_Test == 0) & c(TRUE, diff(Nb_Test) == 1))
## A tibble: 5 x 2
## Groups: ID [2]
# ID Nb_Test
# <chr> <int>
#1 A1 0
#2 A1 1
#3 A1 2
#4 A3 0
#5 A3 1
关于R:删除序列中缺失值后面的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73953615/