【问题标题】:How to filter out a sequence of repeated value with repetitions greater than a specific number如何过滤出重复值大于特定数量的重复值序列
【发布时间】:2018-06-23 00:44:07
【问题描述】:

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

  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 行在 PAXSTEP 下有一个 > 0 我想过滤第 5-100 行。

steps%>%
 group_by(SEQ)%>%

【问题讨论】:

  • 使用lag,您只是检查一个值,n=60 行备份在您的小标题中。如果您想检查 60 个值的完整序列不变,您需要做更多的事情。一种策略是在PAXSTEP 上使用诸如累积总和之类的东西,然后您确实可以检查 60 行以下的单个值是否保持不变(假设您在 PAXSTEP 中没有负值)。

标签: r dplyr tidyverse


【解决方案1】:

这是一种可能的方法。鉴于您的示例数据不足以调查您的案例,我创建了一个示例数据。我特意在SEQN 的一个组中创建了一个 0(60 次)的序列,并试图将其删除。对于每个SEQN,我使用diff()cumsum() 创建了子组。每当PAXSTEP 中的绝对差值大于 0 时,就会创建一个新的子组。使用我的示例数据,您将看到SEQN == 1(第 2-61 行)中 0 序列的子组编号 1。我进一步使用这个变量进行分组。最后一步是逻辑检查。您以PAXSTEP == 0 为目标,并且想要删除长度超过 60 的 0 序列,对吗?通过使用n(),您可以计算每个组中有多少元素(按SEQNcheck 分组)。如果PAXSTEP == 0n() &gt;= 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)

【讨论】:

  • 谢谢,这比我想象的要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
相关资源
最近更新 更多