Có cách nào chúng tôi có thể điền NA
s trong đối tượng zoo
hoặc xts
với số lượng giới hạn NA
giây về phía trước. Nói cách khác, hãy điền vào NA
s tối đa 3 liên tiếp NA
s và sau đó giữ NA
s từ giá trị thứ 4 cho đến khi số hợp lệ.Điền NA trong một chuỗi thời gian chỉ với một số giới hạn
Điều gì đó tương tự.
library(zoo)
x <- zoo(1:20, Sys.Date() + 1:20)
x[c(2:4, 6:10, 13:18)] <- NA
x
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 NA NA NA 5 NA NA
2014-09-27 2014-09-28 2014-09-29 2014-09-30 2014-10-01 2014-10-02 2014-10-03
NA NA NA 11 12 NA NA
2014-10-04 2014-10-05 2014-10-06 2014-10-07 2014-10-08 2014-10-09
NA NA NA NA 19 20
đầu ra mong muốn, sẽ là một cái gì đó với biến n = 3 là
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 1 1 1 5 5 5
2014-09-27 2014-09-28 2014-09-29 2014-09-30 2014-10-01 2014-10-02 2014-10-03
5 NA NA 11 12 12 12
2014-10-04 2014-10-05 2014-10-06 2014-10-07 2014-10-08 2014-10-09
12 NA NA NA 19 20
Tôi đã thử rất nhiều sự kết hợp với na.locf(x, maxgap = 3)
vv mà không có nhiều thành công. Tôi có thể tạo ra một vòng lặp để có được sản lượng mong muốn, tôi đã tự hỏi liệu có cách vectorized để đạt được điều này.
fillInTheBlanks <- function(v, n=3) {
result <- v
counter0 <- 1
for(i in 2:length(v)) {
value <- v[i]
if (is.na(value)) {
if (counter0 > n) {
result[i] <- v[i]
} else {
result[i] <- result[i-1]
counter0 <- counter0 + 1
} }
else {
result[i] <- v[i]
counter0 <- 1
}
}
return(result)
}
Cảm ơn
Thêm một số kịch bản trường hợp sử dụng, khi chúng tôi có một dữ liệu qtrly và chúng tôi biết dữ liệu đó tốt cho 3 tháng tiếp theo và có thể lên tới tối đa 3 tháng nữa, nhưng bất cứ điều gì vượt quá giới hạn chấp nhận được sẽ làm cho dữ liệu thực sự là NA và không nên điền vào cho đến khi có các kịch bản vô hạn. –