R中的最后一次观察向前推进和最后一次观察向后推进

问题描述

我有一个看起来像这样的数据集

df <- data.frame(ID=c(1,1,2,3,3),values=c(NA,NA,12,13,5,1))

我想要这样的输出,以便将最后的观察结果(按组)向前推进,除非在一个填充值之前只有 NA 值,然后我希望向后进行最后一次观察:

df <- data.frame(ID=c(1,values=c(12,1))

我一直在使用 zoo 包中的 dplyr 和 na.locf。到目前为止,我的方法是这样的:

df%>%
group_by(PID%>%
mutate_all(funs(na.locf(.,na.rm = FALSE)))

然而,这只会将最后一次观察结转。 na.locf 函数中的“fromLast”规范将最后一次观察结果向后进行。

但是我如何连接这两个,以便同时使用两个功能

  • na.LOCF 如果在第一个填充值之前没有 NA 值
  • na.LOCF(fromLast) 表示如果在填充的第一个值之前有 NA 值,则向后进行最后一次观察。

在此先感谢您!

解决方法

这应该有效:

library(tidyverse)
df <- data.frame(ID=c(1,1,2,3,3),values=c(NA,NA,12,13,5,1))
df2 <- data.frame(ID=c(1,values=c(12,1))

df <- df %>%
  group_by(ID) %>%
  fill(values,.direction = "downup") %>%
  fill(values,.direction = "updown")