Замените значения NA, если последнее и следующее значения, отличные от NA, совпадают - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь заполнить отсутствующие данные, основываясь на том, совпадают ли предыдущее и последнее значение NA.Например, это фиктивный набор данных:

df <- data.frame(ID = c(rep(1, 6), rep(2, 6), rep(3, 6), rep(4, 6), rep(5, 6), rep(6, 6), 
                    rep(7, 6), rep(8, 6), rep(9, 6), rep(10, 6)), 
             with_missing = c("a", "a", NA, NA, "a", "a", 
                              "a", "a", NA, "b", "b", "b", 
                              "a", NA, NA, NA, "c", "c", 
                              "b", NA, "a", "a", "a", "a", 
                              "a", NA, NA, NA, NA, "a", 
                              "a", "a", NA, "b", "a", "a", 
                              "a", "a", NA, NA, "a", "a", 
                              "a", "a", NA, "b", "b", "b", 
                              "a", NA, NA, NA, "c", "c", 
                              "b", NA, "a", "a", "a", "a"),
             desired_result = c("a", "a", "a", "a", "a", "a", 
                                "a", "a", NA, "b", "b", "b", 
                                "a", NA, NA, NA, "c", "c", 
                                "b", NA, "a", "a", "a", "a", 
                                "a", "a", "a", "a", "a", "a", 
                                "a", "b", "b", "b", "a", "a", 
                                "a", "a", "a", "a", "a", "a", 
                                "a", "a", NA, "b", "b", "b", 
                                "a", NA, NA, NA, "c", "c", 
                                "b", NA, "a", "a", "a", "a")) 

Так что, если, например, есть разрыв в четыре строки, но значения до и после пропуска одинаковы, я хочу, чтобы этот разрыв былзаполнены теми же значениями;тогда как если значения до и после НС отличаются, я не хочу их заполнять.Кроме того, мне нужно сгруппировать данные по переменной ID.

Я пробовал na.locf, но не могу понять, как добавить условие «если они одинаковы до и после NA».

Спасибо.

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете заполнить вперед и назад, а затем установить строки, где они не совпадают на NA.

library(zoo)
library(dplyr)

df %>% 
  mutate_if(is.factor, as.character) %>% 
  group_by(ID) %>%
  mutate(result = na.locf(with_missing, fromLast = T),
         result = ifelse(result == na.locf(with_missing), result, NA))

#    ID with_missing desired_result result
# 1   1            a              a      a
# 2   1            a              a      a
# 3   1         <NA>              a      a
# 4   1         <NA>              a      a
# 5   1            a              a      a
# 6   1            a              a      a
# 7   2            a              a      a
# 8   2            a              a      a
# 9   2         <NA>           <NA>   <NA>
# 10  2            b              b      b
# 11  2            b              b      b
# 12  2            b              b      b
# 13  3            a              a      a
# 14  3         <NA>           <NA>   <NA>
# 15  3         <NA>           <NA>   <NA>
# 16  3         <NA>           <NA>   <NA>
# 17  3            c              c      c
# 18  3            c              c      c
# 19  4            b              b      b
# 20  4         <NA>           <NA>   <NA>
# 21  4            a              a      a
# 22  4            a              a      a
# 23  4            a              a      a
# 24  4            a              a      a
# 25  5            a              a      a
# 26  5         <NA>              a      a
# 27  5         <NA>              a      a
# 28  5         <NA>              a      a
# 29  5         <NA>              a      a
# 30  5            a              a      a
# 31  6            a              a      a
# 32  6            a              b      a
# 33  6         <NA>              b   <NA>
# 34  6            b              b      b
# 35  6            a              a      a
# 36  6            a              a      a
# 37  7            a              a      a
# 38  7            a              a      a
# 39  7         <NA>              a      a
# 40  7         <NA>              a      a
# 41  7            a              a      a
# 42  7            a              a      a
# 43  8            a              a      a
# 44  8            a              a      a
# 45  8         <NA>           <NA>   <NA>
# 46  8            b              b      b
# 47  8            b              b      b
# 48  8            b              b      b
# 49  9            a              a      a
# 50  9         <NA>           <NA>   <NA>
# 51  9         <NA>           <NA>   <NA>
# 52  9         <NA>           <NA>   <NA>
# 53  9            c              c      c
# 54  9            c              c      c
# 55 10            b              b      b
# 56 10         <NA>           <NA>   <NA>
# 57 10            a              a      a
# 58 10            a              a      a
# 59 10            a              a      a
# 60 10            a              a      a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...