2016-08-08 6 views
6

मैंने इसका समाधान देखा है, लेकिन इसे (Fill NA in a time series only to a limited number) समूहों के लिए काम करने के लिए नहीं मिल सकता है, और सोचा कि एक neater होना चाहिए ऐसा करने का तरीका भी?na.locf fills maxgap को भरें, भले ही अंतर> maxgap, समूहों के साथ

dt <- data.table(ID = c(rep("A", 10), rep("B", 10)), Price = c(seq(1, 10, 1), seq(11, 20, 1))) 
dt[c(1:2, 5:10), 2] <- NA 
dt[c(11:13, 15:19) ,2] <- NA 
dt 
    ID Price 
1: A NA 
2: A NA 
3: A  3 
4: A  4 
5: A NA 
6: A NA 
7: A NA 
8: A NA 
9: A NA 
10: A NA 
11: B NA 
12: B NA 
13: B NA 
14: B 14 
15: B NA 
16: B NA 
17: B NA 
18: B NA 
19: B NA 
20: B 20 

मैं करना चाहते हैं क्या, है NA रों आगे दोनों और सबसे हाल ही में गैर NA मूल्य से वापस, लेकिन केवल एक करने के लिए को भरने के लिए:

मैं निम्नलिखित डीटी है कहो अधिकतम दो पंक्तियां आगे या पीछे।

मुझे समूह (आईडी) द्वारा इसे करने की भी आवश्यकता है।

मैं maxgap = x आदि के साथ na.locf/na.approx उपयोग करने की कोशिश की है, लेकिन यह NA रों भर नहीं है, जहां गैर NA मूल्यों के बीच की खाई maxgap से अधिक है। जबकि मैं इन्हें आगे और पीछे भरना चाहता हूं, भले ही गैर-NA मानों के बीच का अंतर maxgap से अधिक हो, लेकिन केवल दो पंक्तियों से अधिक हो।

अंतिम परिणाम चाहिए लग रहा है कि:

ID Price Price_Fill 
1: A NA   3 
2: A NA   3 
3: A  3   3 
4: A  4   4 
5: A NA   4 
6: A NA   4 
7: A NA   NA 
8: A NA   NA 
9: A NA   NA 
10: A NA   NA 
11: B NA   NA 
12: B NA   14 
13: B NA   14 
14: B 14   14 
15: B NA   14 
16: B NA   14 
17: B NA   NA 
18: B NA   20 
19: B NA   20 
20: B 20   20 

हकीकत में, अपने डेटा सेट बड़े पैमाने पर है, और मैं भरने के लिए NA आगे और अप करने के लिए 672 पंक्तियों के लिए वापस एस सक्षम होना चाहते हैं, लेकिन कोई अधिक समूह द्वारा।

धन्यवाद!

उत्तर

4

उदाहरण के लिए पता चला है, हम समूह 'आईडी' से, n = 0:2 साथ 'मूल्य' की shift, और type 3 अस्थायी कॉलम बनाने के लिए, इस से pmax मिलता है, उत्पादन का उपयोग करने के लिए 'लीड' के रूप में मिलता है shifttype = 'lag' साथ और एक ही n (डिफ़ॉल्ट रूप से यह अंतराल 'है), pmin हो और' Price_Fill '

dt[, Price_Fill := do.call(pmin, c(shift(do.call(pmax, c(shift(Price, n = 0:2, 
        type = "lead"), na.rm=TRUE)), n= 0:2), na.rm = TRUE)) , by = ID] 
dt 
# ID Price Price_Fill 
#1: A NA   3 
#2: A NA   3 
#3: A  3   3 
#4: A  4   4 
#5: A NA   4 
#6: A NA   4 
#7: A NA   NA 
#8: A NA   NA 
#9: A NA   NA 
#10: A NA   NA 
#11: B NA   NA 
#12: B NA   14 
#13: B NA   14 
#14: B 14   14 
#15: B NA   14 
#16: B NA   14 
#17: B NA   NA 
#18: B NA   20 
#19: B NA   20 
#20: B 20   20 

एक अधिक सामान्य दृष्टिकोण pmin/pmaxपर करने के लिए किया जाएगा के रूप में निर्दिष्ट'मूल्य' अलग हो सकता है और ओपी के पोस्ट में दिखाए गए क्रम संख्या नहीं हो सकता है।

i1 <- dt[, do.call(pmin, c(shift(do.call(pmax, c(shift(NA^(is.na(Price))* 
    .I, n = 0:2, type = "lead"), na.rm = TRUE)), n = 0:2), na.rm = TRUE)), ID]$V1 

dt$Price_Fill < dt$Price[i1] 
dt$Price_Fill 
#[1] 3 3 3 4 4 4 NA NA NA NA NA 14 14 14 14 14 NA 20 20 20 

अर्थात लगता है हम बदल 'मूल्य' है, यह अलग

dt$Price[3] <- 10 
dt$Price[14] <- 7 
dt$Price_Fill <- dt$Price[i1] 
dt$Price_Fill 
#[1] 10 10 10 4 4 4 NA NA NA NA NA 7 7 7 7 7 NA 20 20 20 
+1

मुझे फिर से सहेजा @akrun हो जाएगा। धन्यवाद! – LyssBucks

संबंधित मुद्दे