首页 > 解决方案 > 如果每季度某一天数的行 = 0,则删除所有行

问题描述

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

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

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),如果证券交易量为 0超过 3 天- 我想从该季度的 DF 中删除它。

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

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

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

非常感谢!

标签: rdplyr

解决方案


我们可以rlefilter'qtr'、'id' 中连续使用 3 天或更长时间

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

注意:使用上面的例子,它会给出完整的数据集,因为条件不满足

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

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

推荐阅读