我有一个数据框,我们称之为 DF,我需要删除某些行。数据框与以下示例非常相似。
|Symbol | Date | Volume |
|----------------------------|
|A |2014-01-01 | 0 |
|A |2014-01-02 | 0 |
|A |2014-01-03 | 0 |
|A |2014-01-04 | 1 |
|B |2014-01-01 |45 |
|B |2014-01-02 |0 |
|B |2014-01-03 |34 |
|B |2014-01-04 |45 |
例如,如果在 Volume 列中存在等于或大于 365 个相对于日期的连续数量的零,即,如果对于符号 A 有 365 个,我需要删除包含符号 A 的所有行盒子体积中连续的零,如果数据是按时间顺序组织的,那么我必须删除所有包含符号A的行;对于该栏中的所有符号,依此类推。我希望能让自己被理解。
我还需要计算根据该标准我必须消除多少个和哪些符号,但我还没有成功。我尝试过这行代码:
count(which(sum(DF$Volume==0)>365))
使用
dplyr
和 rleid
中的 data.table
辅助函数,我们将为 Symbol
组内的连续值添加分组 ID,并计算该分组内的行数:
library(dplyr)
DF <- DF %>%
group_by(Symbol) %>%
mutate(consec_id = data.table::rleid(Volume)) %>%
group_by(Symbol, consec_id) %>%
mutate(n_consec = n())
# count how many to be eliminated
DF %>% group_by(symbol) %>%
summarize(sum(ifelse(any(n_consec > 365 & Volume == 0), 1, 0)))
# actually removing them
DF %>% group_by(symbol) %>%
filter(!any(n_consec > 365 & Volume == 0))