заменить отсутствующий на na.locf0 - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь заполнить пропущенные значения, используя пакет 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 голосов
/ 09 мая 2018

Мы можем использовать

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
0 голосов
/ 09 мая 2018

na.locf0 (правильно) не заполняет компоненты, для которых нет предварительного значения. Если вы хотите заполнить их определенным значением, используйте na.fill. (В разрабатываемой версии zoo 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
0 голосов
/ 09 мая 2018

Вариант 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.locf0, и tidyr::fill заполняют NA записей на основе предыдущих записей (по умолчанию сверху вниз); последний шаг replace заменяет начальные значения NA на 0 (поскольку предыдущих записей нет, эти NA не могут быть заполнены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...