我想利用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(.)))
也许作为额外的提示,如果您使用的是包 imputeTS 的 locf 函数,您可以通过参数 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 时也是如此)