我正在处理一组数据。数据的格式如下:
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)%>%
答案 0 :(得分:2)
这是一种可能的方法。我创建了一个示例数据,因为您的样本数据不足以查看您的案例。我故意在SEQN
中的一个组中创建了一个0(60次)的序列,并尝试将其删除。对于每个SEQN
,我使用diff()
和cumsum()
创建了子组。只要PAXSTEP
中的绝对差值大于0,就会创建一个新的子组。使用我的样本数据,您将在SEQN
== 1(第2-61行)中看到0的序列的子组编号1。我进一步使用这个变量进行分组。最后一步是逻辑检查。你定位PAXSTEP == 0
,你想要删除超过60的0序列,对吧?通过使用n()
,您可以计算每组中保留的元素数量(按SEQN
和check
分组)。如果PAXSTEP == 0
和n() >= 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)