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

Kon*_*rad 1 r zoo dplyr

我想利用这个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(.)))
Run Code Online (Sandbox Code Playgroud)

错误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(.)))
Run Code Online (Sandbox Code Playgroud)

解决方法

潜在的解决方法可能涉及用NAs零替换第一组并且可以稍后替换零前向但是我有兴趣将NAs留在原来的位置并且探索是否有一种方便的方法来na.locf忽略功能没有接收到的情况非NA值开始替换.

G. *_*eck 6

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

na.locf(dta, na.rm = FALSE)
Run Code Online (Sandbox Code Playgroud)

这给出了:

   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
Run Code Online (Sandbox Code Playgroud)

还有is na.locf0:

dta %>% mutate_all(.funs = funs(na.locf0(.)))
Run Code Online (Sandbox Code Playgroud)

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