首先,感谢您抽出宝贵时间查看/回答我的问题。
我在这个问题上有点卡住了-我相信我已经很接近了,但是无法找到想要的解决方案。我有很多库存数据,请参见下面的示例。
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
,但不确定在这种情况下如何应用。
非常感谢您!
答案 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)