删除R中给定列中具有某个连续值的所有行

问题描述 投票:0回答:1

我有一个数据框,我们称之为 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))
r dataframe data-cleaning delete-row
1个回答
2
投票

使用

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))
© www.soinside.com 2019 - 2024. All rights reserved.