R 中的最后一次观察结转和最后一次观察向后结转

问题描述 投票:0回答:1

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

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

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

df <- data.frame(ID=c(1,1,1,1,1,2,2,2,3,3), values=c(12, 12, 12, 13, 13, 5, 5, 5, 1, 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 值,则最后一个观察值将向后进位。

提前非常感谢!

r dataframe dplyr zoo
1个回答
6
投票

这应该有效:

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

df <- df %>%
  group_by(ID) %>%
  fill(values, .direction = "downup") %>%
  fill(values, .direction = "updown")
© www.soinside.com 2019 - 2024. All rights reserved.