Отфильтровывание переменной класса, которая не соответствует последовательному порядку в r

#r #filter

Вопрос:

У меня есть объединенный набор данных, состоящий из данных за три года для одних и тех же id s. Когда я объединил набор данных, я увидел, что оценки некоторых учеников не являются последовательными в последующие годы.

Вот пример набора данных, который выглядит так:

 df lt;- data.frame( id = c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3),  category = c("A","A","A","B","B","B","A","A","A","B","B","B","A","A","A","B","B","B"),  year = c(18,19,20,18,19,20,18,19,20,18,19,20,18,19,20,18,19,20),  grade = c(3,4,5,3,4,5,5,6,8,5,6,8,3,4,6,3,4,6))  gt; df  id category year grade 1 1 A 18 3 2 1 A 19 4 3 1 A 20 5 4 1 B 18 3 5 1 B 19 4 6 1 B 20 5 7 2 A 18 5 8 2 A 19 6 9 2 A 20 8 10 2 B 18 5 11 2 B 19 6 12 2 B 20 8 13 3 A 18 3 14 3 A 19 4 15 3 A 20 6 16 3 B 18 3 17 3 B 19 4 18 3 B 20 6  

В этом образце набора данных id=2 и id=3 имеют эти оценки не в порядке, как 5,6,7 и 3,4,5 . id=2 имеет 5,6,8 вместо 5,6,7 и id=3 имеет 3,4,6 вместо 3,4,5 . Я хотел бы удалить этих студентов из набора данных. Мой желаемый результат будет включать только id=1 то, у кого оценки в порядке в течение следующих лет.

Мой желаемый выходной файл будет:

 gt; df  id category year grade  1 1 A 18 3  2 1 A 19 4  3 1 A 20 5  4 1 B 18 3  5 1 B 19 4  6 1 B 20 5  

Есть какие-нибудь идеи? Спасибо!

Ответ №1:

Получите diff и проверьте all , равно ли из них 1, сгруппировано по «идентификатору» и «категории» в filter группы

 library(dplyr) df %gt;%   group_by(id, category) %gt;%   filter(all(diff(grade) == 1)) %gt;%   ungroup  

-выход

 # A tibble: 6 × 4  id category year grade  lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; 1 1 A 18 3 2 1 A 19 4 3 1 A 20 5 4 1 B 18 3 5 1 B 19 4 6 1 B 20 5  

Комментарии:

1. Ваше решение сработало хорошо. Спасибо!