Как заменить NA с предыдущими значениями столбцов плюс один по группам на основе других столбцов в R? - PullRequest
0 голосов
/ 27 марта 2020

В настоящее время я пытаюсь заменить значения NA в моем фрейме данных предыдущим значением плюс один. Однако существует условие, что значения никогда не должны превышать 52, поскольку это число недель в календарном году. Вот пример приведенного ниже кадра данных:

Animal  Age   Week
Dog     13     5
Dog     14     6
Dog     15     7
Dog     16     NA
Dog     17     NA
Cat     12     46
Cat     13     47
Cat     14     48
Cat     15     49
Cat     16     50
Cat     17     NA
Rat     10     49
Rat     11     50
Rat     12     51
Rat     13     NA
Rat     14     NA
Rat     15     NA
Rat     16     NA
Rat     17     NA

Ниже приведен код, который я хочу вывести:

Animal  Age   Week
Dog     13     5
Dog     14     6
Dog     15     7
Dog     16     8
Dog     17     9
Cat     12     46
Cat     13     47
Cat     14     48
Cat     15     49
Cat     16     50
Cat     17     51
Rat     10     49
Rat     11     50
Rat     12     51
Rat     13     52
Rat     14     1
Rat     15     2
Rat     16     3
Rat     17     4

Предостережение заключается в том, что конечный возраст каждого животного всегда будет 17. Я пытался использовать функции R «Завершить» и «Заполнить», но я не смог найти способ добавить плюс один с условием, что он сбрасывается после 52 недели. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Для каждой группы (Animal) мы добавляем первое Week число к номеру строки и получаем значение остатка. Мы наконец replace значение 0 с 52.

library(dplyr)

df %>%
  group_by(Animal) %>%
  mutate(Week = (first(Week) + row_number() - 1) %% 52,
         Week = replace(Week, Week == 0, 52))


#  Animal   Age  Week
#   <fct>  <int> <dbl>
# 1 Dog       13     5
# 2 Dog       14     6
# 3 Dog       15     7
# 4 Dog       16     8
# 5 Dog       17     9
# 6 Cat       12    46
# 7 Cat       13    47
# 8 Cat       14    48
# 9 Cat       15    49
#10 Cat       16    50
#11 Cat       17    51
#12 Rat       10    49
#13 Rat       11    50
#14 Rat       12    51
#15 Rat       13    52
#16 Rat       14     1
#17 Rat       15     2
#18 Rat       16     3
#19 Rat       17     4

Аналогично, в базе R:

df <- transform(df, Week = ave(Week, Animal, FUN = function(x) 
                     seq_along(x) + x[1] - 1 %% 52))
transform(df, Week = replace(Week, Week == 0, 52))
0 голосов
/ 27 марта 2020

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

library(data.table)
setDT(df)[,  Week := (first(Week) + .N - 1) %% 52, Animal][Week == 0, Week := 52][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...