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

时间:2018-01-13 23:10:47

标签: r dplyr tidyverse

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

  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)

如果它们按顺序发生超过60次,即如果行5-100具有零并且行101具有数字> 0,则我现在想要在PAXSTEP下过滤掉零“0”。在PAXSTEP下0我想过滤5-100行。

steps%>%
 group_by(SEQ)%>%

1 个答案:

答案 0 :(得分:2)

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

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)