在df
中,我想用每个ID的先前非NA值替换NA值
id<-c(1,1,1,1,2,2,2)
purchase<-c(20,NA,NA,10,NA,NA,5)
df<-data.frame(id,purchase)
id purchase
1 20
1 NA
1 NA
1 10
2 NA
2 NA
2 5
理想情况下,输出应如下所示:
id purchase
1 20
1 20
1 20
1 10
2 NA
2 NA
2 5
我知道Replacing NAs with latest non-NA value,但不是每个组都这样做。 任何帮助,将不胜感激。
答案 0 :(得分:1)
三种方式(到目前为止),全部按每个组使用zoo::na.locf
。需要注意的一件事是,您需要 na.rm=FALSE
,否则zoo::na.locf
可能返回缩短的向量(id
为2的情况)。
do.call("rbind.data.frame",
by(df, df$id, function(x) transform(x, purchase = zoo::na.locf(purchase, na.rm=FALSE))))
# id purchase
# 1.1 1 20
# 1.2 1 20
# 1.3 1 20
# 1.4 1 10
# 2.5 2 NA
# 2.6 2 NA
# 2.7 2 5
dplyr
library(dplyr)
df %>%
group_by(id) %>%
mutate(purchase = zoo::na.locf(purchase, na.rm = FALSE))
data.table
library(data.table)
DT <- as.data.table(df)
DT[, purchase := zoo::na.locf(purchase, na.rm = FALSE), by = "id" ]