Замените NA первым появлением, если выполнить условие - PullRequest
0 голосов
/ 24 марта 2020

В data.frame я хотел бы "заполнить" NA с предыдущим значением возраста, если выполняется условие.

>x <- data.frame(
    ID = c(1,1,1,1,2,2,2,2,3,3,4,4,4,4),
    YEAR = c(2016,2017,2018,2019,2016,2017,2018,2019,2016,2018,2016,2017,2018,2019),
    AGE = c("ADULT", NA, NA, NA, "ADULT", NA, "ADULT", NA, "JUVENILE", NA, "JUVENILE", "ADULT", NA, NA)
)

>x
   ID YEAR      AGE
1   1 2016   ADULT
2   1 2017     <NA>
3   1 2018     <NA>
4   1 2019     <NA>
5   2 2016   ADULT
6   2 2017     <NA>
7   2 2018   ADULT
8   2 2019     <NA>
9   3 2016 JUVENILE
10  3 2018     <NA>
11  4 2016 JUVENILE
12  4 2017   ADULT
13  4 2018     <NA>
14  4 2019     <NA>

Я бы хотел указать возраст следующего года, если он взрослый. Но если в первый раз возраст ID был ЮВЕНИЛЬНЫМ, я хотел бы заполнить следующие годы возрастом ВЗРОСЛЫМ.

Я пытался что-то, но я не нашел решения для подготовки в соответствии с первым случаем.

x.age.ok <- x %>% group_by(NUM_PIT, YEAR) %>% fill(AGE, .direction = "down")

Я получил это:

>x.age.ok
   ID YEAR      AGE
1   1 2016   ADULT
2   1 2017   ADULT
3   1 2018   ADULT
4   1 2019   ADULT
5   2 2016   ADULT
6   2 2017   ADULT
7   2 2018   ADULT
8   2 2019   ADULT
9   3 2016 JUVENILE
10  3 2018 JUVENILE
11  4 2016 JUVENILE
12  4 2017   ADULT
13  4 2018   ADULT
14  4 2019   ADULT

Но я хочу это (выделено **):

>x.age.ok
   ID YEAR      AGE
1   1 2016   ADULT
2   1 2017   ADULT
3   1 2018   ADULT
4   1 2019   ADULT
5   2 2016   ADULT
6   2 2017   ADULT
7   2 2018   ADULT
8   2 2019   ADULT
9   3 2016 JUVENILE
10  3 2018   **ADULT**
11  4 2016 JUVENILE
12  4 2017   ADULT
13  4 2018   ADULT
14  4 2019   ADULT

Идеи? Можем ли мы поставить if в mutate?

1 Ответ

0 голосов
/ 24 марта 2020

Может быть, вы можете попробовать:

library(dplyr)

x %>%
  arrange(ID, YEAR) %>%
  group_by(ID) %>%
  mutate(AGE = if(first(AGE) == "JUVENILE") replace(AGE, is.na(AGE), "ADULT") 
               else replace(AGE, is.na(AGE), first(AGE)))


#      ID  YEAR AGE     
#   <dbl> <dbl> <fct>   
# 1     1  2016 ADULT   
# 2     1  2017 ADULT   
# 3     1  2018 ADULT   
# 4     1  2019 ADULT   
# 5     2  2016 ADULT   
# 6     2  2017 ADULT   
# 7     2  2018 ADULT   
# 8     2  2019 ADULT   
# 9     3  2016 JUVENILE
#10     3  2018 ADULT   
#11     4  2016 JUVENILE
#12     4  2017 ADULT   
#13     4  2018 ADULT   
#14     4  2019 ADULT   

Если значение first AGE равно "JUVENILE", мы заменим все значения NA в группе на "ADULT" else на first значение в группе.

...