na.locf填充NAs达到maxgap,即使间隙> maxgap,群组

时间:2016-08-08 06:22:34

标签: r data.table na

我已经看到了解决方案,但无法让它适用于群组 (Fill NA in a time series only to a limited number),并认为必须有更简洁的方法来做到这一点?

说我有以下dt:

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 s ,但最多只能两行向前或向后。

我还需要它由小组(ID)来完成。

我尝试将na.locf / na.approxmaxgap = x等一起使用,但它并未填充NA s,其中非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行,但不能再按组填充。

谢谢!

1 个答案:

答案 0 :(得分:5)

对于显示的示例,我们按ID&#39;分组获取shift&#39; Price&#39;使用n = 0:2type作为&#39;引导&#39;要创建3个临时列,从中获取pmax,请使用输出来shift type = 'lag'(默认情况下是&#39;滞后&#39;)和相同{ {1}},获取n并将其指定为&#39; Price_Fill&#39;

pmin

更通用的方法是在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作为&#39; Price&#39;可以是不同的,而不是OP的帖子中显示的序列号。

.I

即。假设我们改变了“价格”,它会有所不同

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