चलो कहते हैं कि मैं निम्नलिखित की तरह कई पंक्तियों के साथ एक डेटा फ्रेम करते हैं:मान चुनें पंक्ति-वार दिनांकों के बीच रैंक के आधार पर
df <- data.frame(a = c(NA,20,NA),
date1 = c("2016-03-01", "2016-02-01", "2016-02-01"),
b = c(50,NA, NA),
date2 = c("2016-02-01", "2016-03-01", "2016-03-01"),
c = c(10,10, 10),
date3 = c("2016-01-01","2016-01-01", "2016-01-01"))
प्रत्येक पंक्ति के लिए, मैं नवीनतम मूल्य जो एक NA
नहीं है प्राप्त करना चाहते हैं a
, b
, और c
dates
के अनुसार (इसलिए मैं क्रमश: date1
, date2
, या date3
पर देखता हूं और सबसे हालिया चुनता हूं)।
असल में, date1
दिनांक मान b
करने के लिए इसी, date3
दिनांक मान c
करने के लिए इसी देता है देता है दिनांक मान a
, date2
करने के लिए इसी देता है।
तो date1 > date2
& date1 > date3
, मैं, मैं date2
और date3
की तुलना करेंगे, मूल्य लेने के लिए a
हालांकि चाहते हैं, तो मूल्य a
NA
है (जो मेरे उदाहरण में मामला है)। मेरे उदाहरण में, date2 > date3
, और चूंकि मान b
NA
नहीं है लेकिन 50
है, तो मैं अपने अंतिम परिणाम के रूप में 50
ले जाऊंगा।
अब मैं जब से मैं dplyr
उपयोग कर रहा हूँ मेरी dataframe
में सभी पंक्तियों के लिए ऐसा करना चाहते हैं, मैं पद समारोह (उपयोग करते हुए मेरे उदाहरण में से case_when
फ़ंक्शन का उपयोग करने की कोशिश की, मैं एक पहले स्थान पर देखो तिथि, और फिर लिंक किए गए मान को देखें। यदि यह एनए है, तो मैं दूसरी सबसे अच्छी रैंकिंग इत्यादि देखता हूं ...)
हालांकि, मैं बस इतना नहीं कर सकता, जैसा कि मैं करना चाहता हूं, :
df <- df %>%
mutate(result = case_when(is.na(a) & is.na(b) & is.na(c) ~ NA_integer_,
rev(rank(date1, date2, date3))[1] == 3 & !is.na(a) ~ a,
rev(rank(date1, date2, date3))[2] == 3 & !is.na(b) ~ b,
rev(rank(date1, date2, date3))[3] == 3 & !is.na(a) ~ c,
rev(rank(date1, date2, date3))[1] == 2 & !is.na(a) ~ a,
rev(rank(date1, date2, date3))[2] == 2 & !is.na(b) ~ b,
rev(rank(date1, date2, date3))[3] == 2 & !is.na(a) ~ c,
rev(rank(date1, date2, date3))[1] == 1 & !is.na(a) ~ a,
rev(rank(date1, date2, date3))[2] == 1 & !is.na(b) ~ b,
rev(rank(date1, date2, date3))[3] == 1 & !is.na(a) ~ c))
क्योंकि rank
फ़ंक्शन की आवश्यकता है तर्क के रूप में एक अनूठा वेक्टर (लेकिन मैं c(date1, date2, date3)
नहीं डाल सकते न क्योंकि यह मुझे इस सदिश का नहीं पूरे आदेश और प्रत्येक पंक्ति के लिए पद देना होगा)
मेरी उदाहरण परिणाम रहा है करने के लिए
होगा चाहते हैं मेंres
a date1 b date2 c date3 result
NA 2016-03-01 50 2016-02-01 10 2016-01-01 50
20 2016-02-01 NA 2016-03-01 10 2016-01-01 20
NA 2016-02-01 NA 2016-03-01 10 2016-01-01 10
क्या किसी के पास इस समस्या का कोई विचार या यहां तक कि एक पूरी तरह से अलग दृष्टिकोण है?
धन्यवाद! मैं डेटा.table ऑब्जेक्ट के उपयोग के लिए एल्गोरिदम धन्यवाद की गति से प्रभावित हूं – MBB