将每组的NA替换为上一行中的值

时间:2019-02-06 20:35:21

标签: r na

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,但不是每个组都这样做。 任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

三种方式(到目前为止),全部按每个组使用zoo::na.locf。需要注意的一件事是,您需要 na.rm=FALSE,否则zoo::na.locf可能返回缩短的向量(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" ]