用每组前一行中的值替换 NA

Replacing NAs with values in the previous row for each group

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,但不是按组进行。 任何帮助,将不胜感激。

三种方式(到目前为止),每组 都利用了 zoo::na.locf。需要注意的一件事是您 需要 na.rm=FALSE,否则 zoo::na.locf 可能 return 一个缩短的向量(如 id是 2).

基础 R

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" ]