#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. Ваше решение сработало хорошо. Спасибо!