使用 dplyr R 删除在超过 "n" 个时间点中具有零值的 ID

Remove ID's which have a zero value in more than "n" time points with dplyr R

我的数据框是这样的

value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(0,0,0,0,1,1,1,1,2,2,2,2)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)

test <- data.frame(value, time, ID)
test

   value time ID
1   0.00    0  1
2   0.10    0  2
3   0.20    0  3
4   0.40    0  4
5   0.00    1  1
6   0.05    1  2
7   0.05    1  3
8   0.50    1  4
9   0.20    2  1
10  0.40    2  2
11  0.50    2  3
12  0.60    2  4

我想删除所有大于或等于两个时间点的值==0 的 ID 我希望我的数据框看起来像这样,(删除 ID=1 有两个时间点值=0)

2   0.10    0  2
3   0.20    0  3
4   0.40    0  4
6   0.05    1  2
7   0.05    1  3
8   0.50    1  4
10  0.40    2  2
11  0.50    2  3
12  0.60    2  4

我们可以将 filter 与逻辑条件一起使用,方法是使用 sum 获取表达式 value == 0 的计数,然后将其转换为小于 2 的逻辑条件(分组后通过 'ID')

library(dplyr)
test %>%
    group_by(ID) %>%
    filter(sum(value == 0) <2)

在基础 R 中,我们可以使用 subsetave :

n <- 2
subset(test, ave(value == 0, ID, FUN = sum) < n)

#   value time ID
#2   0.10    0  2
#3   0.20    0  3
#4   0.40    0  4
#6   0.05    1  2
#7   0.05    1  3
#8   0.50    1  4
#10  0.40    2  2
#11  0.50    2  3
#12  0.60    2  4

或在 data.table 中:

library(data.table)
setDT(test)[, .SD[sum(value == 0) < n], ID]