我已经看到了解决方案,但无法让它适用于群组 (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.approx
与maxgap = 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行,但不能再按组填充。
谢谢!
答案 0 :(得分:5)
对于显示的示例,我们按ID&#39;分组获取shift
&#39; Price&#39;使用n = 0:2
和type
作为&#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