Как удалить последнюю строку в каждой группе, если она больше по значению, чем предыдущая строка? - PullRequest
1 голос
/ 17 марта 2020

Как можно go удалить последнюю строку по группам по столбцам, если она имеет большее значение, чем предыдущее значение столбца?

Пример:

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

Мне бы хотелось он выглядит следующим образом:

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

В этой ситуации только групповая собака останется такой же, как значение последней строки в столбце 2 для этой группы меньше, чем ее предыдущая строка.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

В одну сторону с slice может быть:

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
1 голос
/ 17 марта 2020

Один dplyr параметр может быть:

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
...