2016-08-08 19 views
6

Tôi đã xem giải pháp cho điều này, nhưng không thể làm cho nó hoạt động cho các nhóm (Fill NA in a time series only to a limited number), và nghĩ rằng phải có một bộ lặp cách để làm điều này cũng?na.locf điền NA vào tối đa ngay cả khi khoảng cách> maxgap, với các nhóm

Nói rằng tôi có dt sau:

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 

Những gì tôi muốn làm, là để lấp đầy NA s cả về phía trước và trở lại từ giá trị phi NA gần đây nhất, nhưng chỉ lên đến một tối đa hai hàng về phía trước hoặc sau.

Tôi cũng cần nó được thực hiện theo nhóm (ID).

Tôi đã cố gắng sử dụng na.locf/na.approx với maxgap = x vv, nhưng nó không điền NA là nơi khoảng cách giữa NA giá trị không lớn hơn maxgap. Trong khi đó, tôi muốn lấp đầy những chuyển tiếp này và ngược lại ngay cả khi khoảng cách giữa các giá trị không phải là NA lớn hơn maxgap, nhưng chỉ bằng hai hàng.

Kết quả cuối cùng nên trông giống như sau:

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 

Trên thực tế, tập hợp dữ liệu của tôi là lớn, và tôi muốn để có thể lấp đầy NA s về phía trước và trở lại lên đến 672 dòng, nhưng không nhiều , theo nhóm.

Cảm ơn!

Trả lời

4

Ví dụ cho thấy, chúng tôi nhóm bởi 'ID', có shift của 'Giá' với n = 0:2, và type là 'dẫn' để tạo 3 cột tạm thời, có pmax từ này, sử dụng đầu ra để làm shift với type = 'lag' (theo mặc định nó là 'lag') và cùng n, có pmin và gán nó như

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 

Một cách tiếp cận tổng quát hơn 'Price_Fill' sẽ được làm pmin/pmax trên .I khi 'Giá' có thể khác và không phải số thứ tự như được hiển thị trong bài đăng của OP.

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 

ví dụ: giả sử chúng ta thay đổi 'Giá', nó sẽ khác nhau

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

lưu tôi một lần nữa @akrun. Cảm ơn! – LyssBucks

Các vấn đề liên quan