Как заменить NA в строках с фиксированным значением по группе? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь найти способ заменить значения NA в моем коде на фиксированное значение.

Example


Animals    Value    
Dog         13
Dog         20
Dog         27
Dog         35
Dog         NA
Dog         NA
Dog         NA
Cat         17
Cat         24
Cat         31
Cat         NA
Cat         NA
Mouse       100
Mouse       107
Mouse       NA
Mouse       NA
Mouse       NA
Mouse       NA

Что я хотел бы сделать, это заменить значения NA кратными 7, чтобы это выглядело например:

Animals    Value    
Dog         13
Dog         20
Dog         27
Dog         34
Dog         41
Dog         48
Dog         55
Cat         17
Cat         24
Cat         31
Cat         38
Cat         45
Mouse       100
Mouse       107
Mouse       114
Mouse       121
Mouse       128
Mouse       135

Я пытался изучить функции «fill» и «complete», но из того, что я собрал, он обычно заполняет NA предыдущим значением строки или фиксированным значением. Любая помощь будет оценена!

1 Ответ

1 голос
/ 10 апреля 2020

Мы можем использовать seq после группировки по 'Животным'

library(dplyr)
df1 %>% 
   group_by(Animals) %>% 
   mutate(Value = seq(first(Value), length.out = n(), by = 7))
# A tibble: 18 x 2
# Groups:   Animals [3]
#   Animals Value
#   <chr>   <dbl>
# 1 Dog        13
# 2 Dog        20
# 3 Dog        27
# 4 Dog        34
# 5 Dog        41
# 6 Dog        48
# 7 Dog        55
# 8 Cat        17
# 9 Cat        24
#10 Cat        31
#11 Cat        38
#12 Cat        45
#13 Mouse     100
#14 Mouse     107
#15 Mouse     114
#16 Mouse     121
#17 Mouse     128
#18 Mouse     135

Или другой вариант coalesce

df1 %>%
   group_by(Animals) %>%
   mutate(Value = coalesce(Value, seq(first(Value), length.out = n(), by = 7L)))

data

df1 <- structure(list(Animals = c("Dog", "Dog", "Dog", "Dog", "Dog", 
"Dog", "Dog", "Cat", "Cat", "Cat", "Cat", "Cat", "Mouse", "Mouse", 
"Mouse", "Mouse", "Mouse", "Mouse"), Value = c(13L, 20L, 27L, 
35L, NA, NA, NA, 17L, 24L, 31L, NA, NA, 100L, 107L, NA, NA, NA, 
NA)), class = "data.frame", row.names = c(NA, -18L))
...