基于先前接受的行的子集数据帧

时间:2018-08-16 05:52:32

标签: r

嗨,我有一个如下所示的数据框,我希望能够对数据框进行子集处理,以便仅保留结果数据框中的那些数据框。我想要3条规则

  1. 如果starT在StarT的前几行之后,在EndT的前几行之前,则该行将被删除
  2. 如果StarT在上一行starT和EndT之间,但是即使该EndT在上一行EndT之后,它仍会被删除
  3. 如果starT在上一行StarT和EndT之后,但在上一行EndT的10内,则将其删除。

它还需要始终引用数据框中保留的最后一行。

 StarT    EndT  Alarmcode 
1 3297.58 3298.62  13902 
2 3297.60 3346.20  13907 
3 3297.62 3346.17  14111 
4 3297.78 3346.13  13909 
5 3298.65 3346.08  13908 
6 3298.70 3298.75  13902 
7 3298.83 3298.88  13902 
8 3298.97 3298.98  13902 
9 3298.98 3346.03  13900 
10 3299.07 3346.00 13902 
11 3344.07 3352.75  1001 
12 3344.48 3345.90 13906 
13 3345.47 3345.87 15111 
14 3345.87 3347.78 15111 
15 3345.92 3346.58 13906 
16 3346.12 3346.17 13902 
17 3346.23 3346.50 13908 
18 3346.25 3346.30 13902 
19 3346.27 3347.75 14111 
20 3346.38 3346.43 13902 
21 3346.52 3346.53 13902 
22 3346.53 3347.70 13900 
23 3346.58 3347.67 13908 
24 3346.60 3347.63 13906 
25 3346.62 3347.60 13902 
26 3347.65 3352.30 13906 
27 3347.70 3347.72 13902 
28 3347.80 3352.25 13908 
29 3347.80 3352.27 15111 
30 3347.80 3352.28 14111 
31 3347.80 3347.85 13902 
32 3347.93 3347.98 13902 
33 3348.07 3348.12 13902 
34 3348.20 3348.22 13902 
35 3348.22 3352.23 13900 
36 3348.30 3352.00 13902 
37 3349.27 3352.22  13907 
38 14157.28 14157.28 5122 
39 27311.37 27311.38 5122 

应保留以下内容:

       StarT EndT  Alarmcode 
1 3297.58 3298.62  13902 
38 14157.28 14157.28 5122 
39 27311.37 27311.38 5122 

1 个答案:

答案 0 :(得分:0)

您可以使用^([^~t.]|t($|[^h])|th($|[^u])|thu($|[^m])|thum($|[^b])|thumb($|[^s])|thumbs($|[^.])|thumbs\.($|[^d])|thumbs\.d($|[^b])|\.($|[^p])|\.p($|[^a])|\.pa($|[^r])|\.par($|[^t]))+$ 中的laglead函数来完成上述操作。 我不太了解您的规则...但是我会尽力为您提供一般性的想法,以便您在理解代码时可以适应您的规则。

基本上,使用dplyr可以引用上一行。然后,您可以根据规则使用lag>创建逻辑语句。

然后,您可以使用<函数直接删除不符合条件的行。请注意,这将更改行的顺序,因为在继续下一个规则之前将其删除。要解决此问题,您可以使用filter创建一列来检查规则状态,并且仅在规则逻辑的末尾应用mutate

这是它的工作方式:

  

如果starT在StarT的前几行之后,在EndT的前几行之前,则该行将被删除

filter
  

如果StarT在上一行starT和EndT之间,但是即使该EndT在上一行EndT之后,它仍会被删除

对不起,我不明白这一点。听起来和第一个一样?

  

如果starT在上一行StarT和EndT之后,但在上一行EndT的10内,则将其删除。

df <- df %>%
  mutate(rule = ifelse(StarT > lag(StarT, 1) & StarT < lag(EndT, 1), 'remove', 'keep'))

然后您可以结束:

df <- df %>%
  mutate(rule = ifelse(StarT > lag(EndT, 1) + 10, 'remove', rule))

希望这会有所帮助。 否则,如果您可以阐明第二条规则,很乐意编写完整的代码。