Как я могу извлечь дублирующие значения с той же максимальной датой на основе другого var?

#r #dplyr #duplicates #data-wrangling

#r #dplyr #дубликаты #перебор данных

Вопрос:

Я сгенерировал ‘с повторениями’ df со строками, которые имеют по крайней мере один дубликат в другом df (с переменными DROPS как количество повторений на уникальный FID ID).

 FID ID CID CT DROPS    DATE
123 CV  1  2    3   11-3-2020
123 CV  2  2    2   11-3-2020
123 CV  3  1    1   11-3-2020  
456 LO  1  1    2   10-4-2020 
456 LO  2  1    1   10-5-2020
678 IP  1  2    3   11-1-2020
678 IP  1  1    2   11-2-2020
678 IP  2  2    1   10-29-2020
111 AK  1  2    2   11-2-2020
111 AK  2  2    1   11-1-2020
222 PL  4  2    2   11-1-2020
222 PL  3  2    2   11-1-2020 
  

Я хочу извлечь только одно из удалений для каждого уникального идентификатора и FID, сохраняя последнюю ДАТУ. Для строк с CT == 1 я хочу сохранить только эту строку и сохранить последнюю дату. Для тех строк, в которых есть только значения CT== 2, также сохраняйте последнюю дату. Это строка кода, которую я использую:

keepers <- withrepeats %>% group_by %>% (ID, FID) %>% filter(DATE == max(DATE))

Однако строки с той же датой сохраняются. В этом случае я хотел бы сохранить самый высокий CID или, если есть строка, где CT == 1, сохранить эту строку.

Желаемый результат:

 FID ID CID CT DROPS    DATE
123 CV  3  1    1   11-3-2020   
456 LO  2  1    1   10-5-2020
678 IP  1  1    2   11-2-2020
111 AK  1  2    2   11-2-2020
222 PL  4  2    2   11-1-2020
  

Как бы вы поступили по этому поводу? Любая помощь будет принята с благодарностью!

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

1. Правильный ли ожидаемый результат

2. Я обновил df и вывод. спасибо за ваше терпение.

Ответ №1:

Мы можем преобразовать ‘DATE’ в Date class, затем сгруппировать по ‘FID’ и slice строке со max значением в ‘DATE’

 library(dplyr)
library(lubridate)
withrepeats %>%
   mutate(DATE = mdy(DATE)) %>%
   arrange(FID, desc(CID)) %>%
   group_by(FID) %>% 
   mutate(mxDate = if(any(CT == 1)) DATE[which.max(DATE)] else 
        DATE[which.max(DATE)]) %>%
   filter(DATE == mxDate amp; !duplicated(DATE)) %>% 
   ungroup %>% 
   slice(c(2, 4, 5, 1, 3)) %>%
   select(-mxDate)
  

-вывод

 # A tibble: 5 x 6
#    FID ID      CID    CT DROPS DATE      
#  <int> <chr> <int> <int> <int> <date>    
#1   123 CV        3     1     1 2020-11-03
#2   456 LO        2     1     1 2020-10-05
#3   678 IP        1     1     2 2020-11-02
#4   111 AK        1     2     2 2020-11-02
#5   222 PL        4     2     2 2020-11-01
  

данные

 withrepeats <- structure(list(FID = c(123L, 123L, 123L, 456L, 456L, 678L, 678L, 
678L, 111L, 111L, 222L, 222L), ID = c("CV", "CV", "CV", "LO", 
"LO", "IP", "IP", "IP", "AK", "AK", "PL", "PL"), CID = c(1L, 
2L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 4L, 3L), CT = c(2L, 2L, 1L, 
1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L), DROPS = c(3L, 2L, 1L, 2L, 
1L, 3L, 2L, 1L, 2L, 1L, 2L, 2L), DATE = c("11-3-2020", "11-3-2020", 
"11-3-2020", "10-4-2020", "10-5-2020", "11-1-2020", "11-2-2020", 
"10-29-2020", "11-2-2020", "11-1-2020", "11-1-2020", "11-1-2020"
)), class = "data.frame", row.names = c(NA, -12L))
  

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

1. Спасибо! Есть несколько строк PID ID, где нет CT == 1, только 2. Я не хочу полностью их отфильтровывать, но по-прежнему сохраняю для них последнюю дату. Я обновлю свой набор данных. Еще раз спасибо

2. @akrum спасибо. как мне сохранить самый высокий CID или CASE_ID для тех, у которых одинаковые даты?

Ответ №2:

Сначала преобразуйте DATE объекты фактической даты, arrange данные по FID ID и CT значения и выберите максимальное DATE значение для каждой группы.

 library(dplyr)

withrepeats %>%
  mutate(DATE = as.Date(DATE, '%m-%d-%Y')) %>%
  arrange(FID, ID, CT) %>%
  group_by(FID, ID) %>%
  slice(which.max(DATE))

#    FID ID      CID    CT DROPS DATE      
#  <int> <chr> <int> <int> <int> <date>    
#1   111 AK        1     2     2 2020-11-02
#2   123 CV        3     1     1 2020-11-03
#3   222 PL        4     2     2 2020-11-01
#4   456 LO        2     1     1 2020-10-05
#5   678 IP        1     1     2 2020-11-02