根据过去或未来的值填充缺失/空行

时间:2016-03-16 07:30:19

标签: r

假设我有数据

ID Price 
1  0
1  0
1  0
1  5
2  2
2  0
2  0
2  3
3  0
3  0
3  0
3  0
4  2
4  2
4  0
4  2

我想根据特定ID中的过去或未来值填写缺失单元格的值,但如果特定ID的所有值都为零,请保持原样。

所以表格看起来像

ID Price 
1  5
1  5
1  5
1  5
2  2
2  2
2  2
2  3
3  0
3  0
3  0
3  0
4  2
4  2
4  2
4  2

我尝试用以下代码解决它

is.na(df$Price) <- df$Price==0
setDT(df1)[,Price := na.locf(na.locf(Price, na.rm=FALSE), fromLast=TRUE) , by = ID]

但它会将Price的所有价值更改为FALSE或TRUE。我做错了什么?

1 个答案:

答案 0 :(得分:2)

以下是OP代码的变体,用于执行data.table框架中的所有步骤。我们转换了&#39; data.frame&#39;到&#39; data.table&#39;。转换价格&#39;值为0到NA,使用开始和结束值na.locf,按ID&#39;分组,最后转换&#39; NA&#39;值为0.

library(zoo)
library(data.table)
setDT(df2)[,  PriceN := na.locf(na.locf(Price*(NA_real_^!Price),
     na.rm=FALSE), fromLast=TRUE, na.rm=FALSE), ID
       ][is.na(PriceN), PriceN := 0]