R 中的最后一次观察向前进行,最后一次观察向后进行
Last observation carried forward and last observation carried backward in R
我有一个看起来像这样的数据集
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 值,最后的观察结果会向后进行。
在此先感谢您!
这应该有效:
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")
我有一个看起来像这样的数据集
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 值,最后的观察结果会向后进行。
在此先感谢您!
这应该有效:
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")