用na.locf0替换缺失

时间:2018-05-09 12:14:05

标签: r

我正在尝试使用zoo包填充缺失的值。 我的数据集如下

a=c("2017-01-12 00:00:00","2017-01-12 00:03:00","2017-01-12 00:08:00",
    "2017-01-12 00:11:00","2017-01-12 00:14:00","2017-01-12 04:59:00","2017-01-12 05:10:00",
    "2017-01-12 05:30:00")
b=c(NA,NA,1,NA,0,NA,1,NA)
df =data.frame(a,b)

填补我正在尝试的遗失

df$new = na.locf0(df$b,fromLast=F)

O / p应该是:

a               b   new
1/12/2017 0:00  NA  0
1/12/2017 0:03  NA  0
1/12/2017 0:08  1   1
1/12/2017 0:11  NA  1
1/12/2017 0:14  0   0
1/12/2017 4:59  NA  0
1/12/2017 5:10  1   1
1/12/2017 5:30  NA  1

提前致谢。

3 个答案:

答案 0 :(得分:1)

na.locf0(正确)不填写没有先前值的组件。如果您想填写具有某些特定值的那些,请使用na.fill。 (在动物园na.fill0的开发版中也可以使用。)

transform(df, new = na.fill(na.locf0(b), 0))

,并提供:

                    a  b new
1 2017-01-12 00:00:00 NA   0
2 2017-01-12 00:03:00 NA   0
3 2017-01-12 00:08:00  1   1
4 2017-01-12 00:11:00 NA   1
5 2017-01-12 00:14:00  0   0
6 2017-01-12 04:59:00 NA   0
7 2017-01-12 05:10:00  1   1
8 2017-01-12 05:30:00 NA   1

答案 1 :(得分:0)

选项1

使用zoo::na.locf0

library(zoo);
library(tidyverse);
df %>% mutate(b = na.locf0(b), b = replace(b, is.na(b), 0))
#                    a b
#1 2017-01-12 00:00:00 0
#2 2017-01-12 00:03:00 0
#3 2017-01-12 00:08:00 1
#4 2017-01-12 00:11:00 1
#5 2017-01-12 00:14:00 0
#6 2017-01-12 04:59:00 0
#7 2017-01-12 05:10:00 1
#8 2017-01-12 05:30:00 1

选项2

使用tidyr::fill

df %>% fill(b) %>% mutate(b = replace(b, is.na(b), 0))
#                    a b
#1 2017-01-12 00:00:00 0
#2 2017-01-12 00:03:00 0
#3 2017-01-12 00:08:00 1
#4 2017-01-12 00:11:00 1
#5 2017-01-12 00:14:00 0
#6 2017-01-12 04:59:00 0
#7 2017-01-12 05:10:00 1
#8 2017-01-12 05:30:00 1

说明:zoo::na.locf0tidyr::fill根据以前的条目填充NA个条目(默认情况下自上而下);最后一个replace步骤将NA值替换为0(因为之前没有条目,因此无法填充这些NA

答案 2 :(得分:0)

我们可以使用

df$new <- na.locf(df$b,fromLast=F, na.rm = FALSE)
df$new[is.na(df$new)] <- 0
df$new
#[1] 0 0 1 1 0 0 1 1