मैंने पंक्तियों के साथ एक 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
आप इस बारे में कैसे जाएंगे? किसी भी प्रकार की सहायता सराहनीय होगी!
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))
पहले 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