r语言 - 使用 na.locf 向前传递最后一个值,当第一个观察值为 na 时忽略第一行



我想利用na.locf来结转第一次观测值可能为零的数据帧的非缺失值。

问题

dta <- data.frame(A = c(NA, NA, 1, 2, 4, 5, NA, NA, NA),
                  B = c(NA, 5, 4, 5, 8, 9, NA, NA, 100))
dta %>% mutate_all(.funs = funs(na.locf(.)))

mutate_impl(.data, dots)中的错误:列A的长度必须为 9 (行数)或 1,而不是 7

期望的结果

Vectorize(require)(package = c("dplyr", "zoo"),
                   character.only = TRUE)
dta <- data.frame(A = c(0, NA, 1, 2, 4, 5, NA, NA, NA),
                  B = c(0, 5, 4, 5, 8, 9, NA, NA, 100))
dta %>% mutate_all(.funs = funs(na.locf(.)))

解决方法

潜在的解决方法可能涉及用零替换第一组NAs并将零向前移动,以后可以替换,但我有兴趣将 NA 留在原地,并探索是否有一种方便的方法可以让na.locf忽略函数未收到非 NA 值的情况开始替换。

使用 na.rm = FALSE 参数,注意它可以占用整个数据框 - 您不必单独将其应用于每一列。

na.locf(dta, na.rm = FALSE)

这给出了:

   A   B
1 NA  NA
2 NA   5
3  1   4
4  2   5
5  4   8
6  5   9
7  5   9
8  5   9
9  5 100

还有is na.locf0

dta %>% mutate_all(.funs = funs(na.locf0(.)))

请参阅帮助页面?na.locf其中记录了na.rm参数以及文档na.locf0。 请注意,na.locf0 目前必须按列单独应用,但始终生成相同长度的输出。

(当@docendodiscimus的评论出现时,正在写这个答案)

?na.locf

NA.rm 逻辑。是否应删除主要 NA?

因此,请使用 na.rm=FALSE ,可以选择将剩余的 NA 值(即前导值)替换为零:

dta <- data.frame(A = c(NA, NA, 1, 2, 4, 5, NA, NA, NA),
                  B = c(NA, 5, 4, 5, 8, 9, NA, NA, 100))
na_zero <- function(x) replace(x,is.na(x),0)
dta %>% mutate_all(.funs = funs(na.locf(.,na.rm=FALSE))) %>%
   mutate_all(.funs=funs(na_zero(.)))

也许作为额外的提示,如果您使用的是包 imputeTSlocf 函数,您可以通过参数 na.still 在几个选项之间进行选择,了解如何处理尾随 NA:

选择的 na.剩余:

  • 保留" - 返回带有 NA 的系列
  • "rm" - 删除剩余的 NA
  • "平均值" - 用总体平均值替换剩余的 NA
  • "Rev" - 从相反的方向执行 NOCB/LOCF

因此,可以通过以下方式达到所需的输出:

dta <- data.frame(A = c(NA, NA, 1, 2, 4, 5, NA, NA, NA),
              B = c(NA, 5, 4, 5, 8, 9, NA, NA, 100))
library(imputeTS)
na.locf(dta, na.remaining = "keep")

这里不需要mutate_all,因为 na.locf 会自动应用于所有列(使用 zoo 的 na.locf 时也是如此)

最新更新