我想利用na.locf
为第一次观察可能为零的数据帧继承非缺失值。
if test x"$postlink_cmds" = "x"; then
postlink_cmds="./postlink.sh"
else
postlink_cmds="~ ./postlink.sh"
fi
~
中的错误:列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(.)))
的长度必须为9 (行数)或一,而不是7
mutate_impl(.data, dots)
潜在的解决方法可能涉及用零替换第一组A
并且可以稍后替换零转发但是我有兴趣将NAs留在原地并探索是否有方便的方法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(.)))
忽略函数未收到非NA值以开始替换的情况。
答案 0 :(得分:6)
使用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当前必须按列单独应用,但始终生成相同长度的输出。
答案 1 :(得分:3)
(当@ 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(.)))
答案 2 :(得分:0)
作为附加提示,如果您使用软件包 imputeTS 的 locf 功能,则可以在有关尾随的操作的多个选项之间进行选择。 NAs ,通过参数 na.remaining :
其余部分的选择:
因此可以通过以下方式达到所需的输出:
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时也是如此)