R 根据过去或将来的值填充缺少的行/空行

R 根据过去或将来的值填充缺少的行/空行,r,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 我

假设我有一个数据

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]

is.na(df$Price)这里是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]

当我运行您的代码时,结果看起来与您期望的结果相同,除了ID==3的所有价格条目都是NA。如果您希望在此处命名,可以轻松将其更改回0。似乎他们只需要将
NA
更改为
0
返回。只需添加
[is.NA(Price),Price:=0]
,您应该很好。您如何用值2(而不是3)用ID 2填充缺少的值?@docendodiscimus抱歉,没有检查OP的代码,开始用数据编码。但是,这应该可以解决OP代码中的任何问题。工作正常。Thanks@akrun