R сравните даты с инструкцией по группам

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