如果每季度某天的某行= 0,则删除所有行

时间:2018-10-11 17:44:21

标签: r dplyr

首先,感谢您抽出宝贵时间查看/回答我的问题。

我在这个问题上有点卡住了-我相信我已经很接近了,但是无法找到想要的解决方案。我有很多库存数据,请参见下面的示例。

id     date     qtr     price   volume  
1     2/8/12   2012 Q1   101        0
1     2/9/12   2012 Q1   101.1     105
1     2/17/12  2012 Q1   102.1      0
1     3/13/12  2012 Q1   104.1      0
1     5/12/12  2012 Q2   99.1       0
1     5/14/12  2012 Q2   101.1     24
2     2/12/12  2012 Q1   4          0
2     2/15/12  2012 Q1   4          0
2     3/19/12  2012 Q1   4.5       102
2     5/12/12  2012 Q2   6.5       291
2     5/13/12  2012 Q2   6.54      45

本质上,我想要group_by(qtr,id),并且如果该卷的安全性为超过3天,该卷为0-我想将该季度从DF删除。 / p>

我假设公式看起来像这样:

df %>% group_by(qtr, id) %>% filter(.....)

我看过其他类似的问题,但是,大多数问题都使用rowSums,但不确定在这种情况下如何应用。

非常感谢您!

3 个答案:

答案 0 :(得分:2)

我们可以在rle中使用filter连续3天或更长时间的“ qtr”,“ id”中具有“交易量”的

library(dplyr)
df %>% 
  group_by(qtr, id) %>% 
  filter(with(rle(volume == 0), !any(lengths[values] >= 3)))

注意:使用上面的示例,由于不满足条件,它将提供完整的数据集

在这里,我们假设连续的“体积”。如果不是这种情况,即每组3天,则类似于base R中的@RyanD的一个选项就是

df[with(df, ave(volume == 0, id, qtr, FUN = sum) <=3),]

答案 1 :(得分:2)

library(dplyr)

df %>% 
  group_by(id, qtr) %>% 
  filter(sum(volume == 0) <= 3)

或者使用data.table

library(data.table)
setDT(df)

df[, if(sum(volume == 0) <= 3) .SD, by = .(id, qtr)]

答案 2 :(得分:1)

df %>% 
  mutate(volume_ind = volume == 0) %>%
  group_by(qtr, id) %>%
  mutate(volume_ind = sum(volume_ind)))  %>%
  ungroup %>%
  filter(volume_ind <3) %>%
  select(-volume_ind)