Jihong
Jihong

Reputation: 163

How to remove last row in each group if it is larger in value than the previous row?

How would one go about removing the last row by group by column if it has a larger value than its previous column value?

Example:

Dataframe:

Column 1    Column 2
Dog            5     
Dog            6
Dog            5
Cat            3
Cat            5
Cat            4
Cat            7
Mule           2
Mule           4
Mule           6
Mule           8
Mouse          4
Mouse          6
Mouse          9

I would like it to appear as:

Dataframe:

Column 1    Column 2
Dog            5     
Dog            6
Dog            5
Cat            3
Cat            5
Cat            4
Mule           2
Mule           4
Mule           6
Mouse          4
Mouse          6

Only the group dog would remain the same in this situation as the last row value in column 2 for that group is smaller than its previous row.

Upvotes: 1

Views: 260

Answers (2)

Ronak Shah
Ronak Shah

Reputation: 388982

One way with slice can be :

library(dplyr)

df %>%
  group_by(Column1) %>%
  slice(if(last(Column2) > nth(Column2, n() - 1)) 
           seq_len(n() - 1) else seq_len(n()))

#  Column1 Column2
#   <fct>     <int>
# 1 Cat           3
# 2 Cat           5
# 3 Cat           4
# 4 Dog           5
# 5 Dog           6
# 6 Dog           5
# 7 Mouse         4
# 8 Mouse         6
# 9 Mule          2
#10 Mule          4
#11 Mule          6

Upvotes: 1

tmfmnk
tmfmnk

Reputation: 39858

One dplyr option could be:

df %>%
 group_by(Column1) %>%
 filter(!(1:n() == max(1:n()) & Column2 > lag(Column2)))

   Column1 Column2
   <chr>     <int>
 1 Dog           5
 2 Dog           6
 3 Dog           5
 4 Cat           3
 5 Cat           5
 6 Cat           4
 7 Mule          2
 8 Mule          4
 9 Mule          6
10 Mouse         4
11 Mouse         6

Upvotes: 1

Related Questions