当第一次观察是na时,使用na.locf向前移动最后一个值而忽略第一行

时间:2017-11-09 15:59:37

标签: r dplyr zoo

我想利用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值以开始替换的情况。

3 个答案:

答案 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

其余部分的选择:

  • 保持”-返回带有NA的系列
  • “ rm”-删除剩余的NAs
  • “均值”-用总体均值替换剩余的资产净值
  • “ 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时也是如此)