如何过滤掉重复次数大于特定数字的重复值序列

How to filter out a sequence of repeated value with repetitions greater than a specific number

我正在处理一组数据。数据格式如下:

  SEQ       STEP
  <dbl>     <dbl>
1 x         4.00
2 x         0   
3 x         0   
4 x         4.00
5 x         0   
6 x         0

我使用以下代码按 SEQ 对数据进行分组,因为大约有 50000 个 SEQ ID:

steps%>%
group_by(SEQ)

我现在想过滤掉 PAXSTEP 下的零“0”,如果它们按顺序出现超过 60 次,即如果第 5-100 行有零并且第 101 行有一个数字 > 0 在 PAXSTEP 下我想过滤掉第 5-100 行。

steps%>%
 group_by(SEQ)%>%

这是一种可能的方法。鉴于您的样本数据不足以调查您的案例,我创建了一个样本数据。我故意在 SEQN 的一组中创建了一个 0(60 次)的序列,并试图将其删除。对于每个 SEQN,我使用 diff()cumsum() 创建了子组。每当 PAXSTEP 中的绝对差值大于 0 时,就会创建一个新的子组。使用我的示例数据,您将看到 SEQN == 1 中 0 序列的子组编号 1(第 2-61 行)。我进一步使用这个变量进行分组。最后一步是逻辑检查。你的目标是 PAXSTEP == 0 并且你想删除长度超过 60 的 0 序列,对吗?通过使用 n(),您可以计算每个组中有多少元素(按 SEQNcheck 分组)。如果PAXSTEP == 0n() >= 60,则表示要删除满足条件的行。出于子集的原因,我在这里否定了条件。以下代码从 SEQN == 1 中删除 60 行,这些行在 PAXSTEP 中包含 0。

library(dplyr)

mydf <- data.frame(SEQN = rep(c(1,2), each = 100),
                   value = 1:200,
                   PAXSTEP = c(1, rep(0, times = 60), 62:200))

group_by(mydf, SEQN) %>%
mutate(check = cumsum(c(F, abs(diff(PAXSTEP)) > 0))) %>%
group_by(check, add = TRUE) %>%
filter(!(PAXSTEP == 0 & n() >= 60)) %>%
ungroup %>%
select(-check)