Dalam data.frame, saya ingin "mengisi" NA dengan nilai usia sebelumnya jika memenuhi suatu kondisi.

>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>

Saya ingin mengisi usia untuk tahun depan dengan usia sebelumnya jika sudah DEWASA. Tetapi jika kemunculan pertama ID itu adalah JUVENILE, saya ingin mengisi tahun-tahun berikutnya dengan usia DEWASA.

Saya mencoba sesuatu tetapi saya tidak menemukan solusi untuk pengkondisian sesuai dengan kejadian pertama.

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

Saya mendapatkan ini:

>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

Tapi saya ingin ini (disorot dengan **):

>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

Ide ide ? Bisakah kita memasukkan if ke dalam mutate?

0
maryvrx 24 Maret 2020, 13:20

1 menjawab

Jawaban Terbaik

Mungkin Anda bisa mencoba:

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   

Jika nilai first AGE adalah "JUVENILE" kita ganti semua nilai NA dalam grup dengan "ADULT" else dengan nilai first dalam kelompok.

0
Ronak Shah 24 Maret 2020, 10:35