>假设我有一个数据
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。我做错了什么?
这是OP代码的一个变体,用于在data.table框架中执行所有步骤。 我们将"data.frame"转换为"data.table"。 将 0 的"价格"值转换为 NA,使用开始值和结束值的na.locf
,按"ID"分组,最后将"NA"值转换为 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]