#r #dplyr
Вопрос:
Используя dplyr, я хочу выполнить группировку с последующим сравнением дат для следующего фрейма данных.
df lt;- data.frame(ID = c(1,1,2,2,3,3,4,4,5,6), X1 = c("A","A","B","C","A","B","B","B","C","A"), X2 = sample(10:30,10,replace = TRUE), dat = as.Date(c("2021-01-01","2021-01-01","2021-02-01","2021-02-01","2021-01-03", "2021-10-05","2021-05-05","2021-05-06","2021-09-14","2021-06-04")))
Группа по должна быть по идентификатору и X1 (X2 можно игнорировать). Таким образом, в принципе, для всех идентификаторов с одинаковыми значениями для X1 следует сравнивать даты и сохранять идентификаторы, в которых разница в датах составляет 1 (положительный или отрицательный) или меньше. Желаемый результат -:
ID X1 1 1 A 2 1 A 3 4 B 4 4 B
Комментарии:
1. Что подразумевается под разницей в датах? Какие даты сравниваются?
2. Для каждой комбинации идентификатора и X1, имеющей более 1 идентичной комбинации. Итак, идентификатор 1 имеет 2 одинаковых значения для X1 (A). Поэтому даты должны быть сопоставлены. То же самое касается идентификатора 4. Идентификаторы 2,3,5,6 имеют разные (или только 1) значения для X1 и поэтому должны быть исключены. Вот почему я думал о группе, но, может быть, есть лучший способ.
Ответ №1:
Группировка по ID
и X1
выберите только те группы, в которых 2 или более строк, а разница между датами равна 1.
Вы можете попробовать —
library(dplyr) df %gt;% group_by(ID, X1) %gt;% filter(n() gt;= 2, all(abs(diff(dat)) lt;= 1)) %gt;% ungroup # ID X1 X2 dat # lt;dblgt; lt;chrgt; lt;intgt; lt;dategt; #1 1 A 30 2021-01-01 #2 1 A 19 2021-01-01 #3 4 B 24 2021-05-05 #4 4 B 30 2021-05-06
Если вас интересует только ID
и X1
столбец добавить %gt;% select(ID, X1)
.