मैंने पंक्तियों के साथ एक df 'withrepeats' जेनरेट किया है जिसमें कम से कम एक डुप्लिकेट दूसरे 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 

मैं नवीनतम DATE को ध्यान में रखते हुए प्रति अद्वितीय आईडी और FID में से केवल एक बूंद निकालना चाहता हूं। CT == 1 वाली पंक्तियों के लिए, मैं केवल उस पंक्ति को रखना चाहता हूं और नवीनतम तिथि रखना चाहता हूं। केवल CT== 2 मानों वाली उन पंक्तियों के लिए, नवीनतम तिथि भी रखें। मैं जिस कोड का उपयोग कर रहा हूं वह यह है:

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

हालांकि, एक ही तारीख वाली पंक्तियों को रखा जा रहा है। इस मामले में, मैं उच्चतम सीआईडी ​​रखना चाहता हूं, या जहां एक पंक्ति है जहां सीटी == 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
Adri 5 नवम्बर 2020, 02:05

2 जवाब

सबसे बढ़िया उत्तर

हम 'DATE' को Date क्लास में बदल सकते हैं, फिर 'DATE' में 'FID' और slice के आधार पर एक ग्रुप बना सकते हैं, जिसका मान max हो सकता है।

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 & !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
akrun 5 नवम्बर 2020, 03:23

पहले 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
0
Ronak Shah 5 नवम्बर 2020, 07:50