Cara memperkirakan persentase waktu terlihat tergantung pada variabel Tanggal Waktu dan Jumlah kali terlihat per jam

Dalam posting ini (Bagaimana cara menambahkan variabel yang memperkirakan proporsi hari seseorang dilihat sejak pertama kali) Saya menanyakan sesuatu dengan tujuan akhir yang serupa, tetapi di sini kerangka datanya sama sekali berbeda.

Di sini, df1 merangkum per jam (Datetime) berapa kali hewan tertentu (ID) terlihat (Times_seen_per_hour) dalam area tertentu. Karena kami mengetahui apakah hewan tersebut berada di area tersebut pada jam ini, kami juga membuat kolom Presence, yang menunjukkan apakah hewan tersebut berada di area yang dapat kami deteksi.

Saya ingin mengetahui proporsi jam dimana hewan tersebut terdeteksi dibandingkan dengan jumlah total jam yang kita ketahui bahwa hewan tersebut berada di area tersebut.

Di sini, contoh dari apa yang saya miliki sekarang:

df1<- data.frame(Datetime= ymd_hms(c("2019-05-20 12:00:00","2019-05-20 12:00:00","2019-05-20 13:00:00","2019-05-20 13:00:00","2019-05-20 14:00:00","2019-05-20 14:00:00","2019-05-20 15:00:00","2019-05-20 15:00:00","2019-05-20 16:00:00","2019-05-20 16:00:00","2019-05-20 17:00:00","2019-05-20 17:00:00","2019-05-20 18:00:00","2019-05-20 18:00:00","2019-05-20 19:00:00","2019-05-20 19:00:00")),
                 ID= c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2),
                 Times_seen_per_hour=c(3,0,0,4,2,1,3,2,1,0,0,0,7,0,4,1),
                 Presence= c(TRUE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,TRUE,FALSE,TRUE,TRUE,TRUE,TRUE))
df1

              Datetime ID Times_seen_per_hour Presence
1  2019-05-20 12:00:00  1                   3     TRUE
2  2019-05-20 12:00:00  2                   0    FALSE
3  2019-05-20 13:00:00  1                   0     TRUE
4  2019-05-20 13:00:00  2                   4     TRUE
5  2019-05-20 14:00:00  1                   2     TRUE
6  2019-05-20 14:00:00  2                   1     TRUE
7  2019-05-20 15:00:00  1                   3     TRUE
8  2019-05-20 15:00:00  2                   2     TRUE
9  2019-05-20 16:00:00  1                   1     TRUE
10 2019-05-20 16:00:00  2                   0    FALSE
11 2019-05-20 17:00:00  1                   0     TRUE
12 2019-05-20 17:00:00  2                   0    FALSE
13 2019-05-20 18:00:00  1                   7     TRUE
14 2019-05-20 18:00:00  2                   0     TRUE
15 2019-05-20 19:00:00  1                   4     TRUE
16 2019-05-20 19:00:00  2                   1     TRUE

Seperti disebutkan, saya perlu membuat variabel baru bernama Prop_hours_seen yang menunjukkan proporsi jam hewan tersebut terlihat dengan jumlah total jam yang kita ketahui hewan tersebut berada di sana (Presence == TRUE).

Saya mengharapkan ini:

> df1
              Datetime ID Times_seen_per_hour Presence Prop_hours_seen
1  2019-05-20 12:00:00  1                   3     TRUE            1.00 # We divide number of hours seen between total number of hours it could have been seen, that is 1/1.
2  2019-05-20 12:00:00  2                   0    FALSE              NA # We don't consider this hour since the animal wasn't in our area of interest.
3  2019-05-20 13:00:00  1                   0     TRUE            0.50 # We divide number of hours seen (it was seen 1 hour) between total number of hours it could have been seen (it could have been seen at 12:00:00 and at 13:00:00), that is 1/2=0.5.
4  2019-05-20 13:00:00  2                   4     TRUE            1.00
5  2019-05-20 14:00:00  1                   2     TRUE            0.66
6  2019-05-20 14:00:00  2                   1     TRUE            1.00
7  2019-05-20 15:00:00  1                   3     TRUE            0.75
8  2019-05-20 15:00:00  2                   2     TRUE            1.00
9  2019-05-20 16:00:00  1                   1     TRUE            0.80
10 2019-05-20 16:00:00  2                   0    FALSE              NA
11 2019-05-20 17:00:00  1                   0     TRUE            0.66
12 2019-05-20 17:00:00  2                   0    FALSE              NA
13 2019-05-20 18:00:00  1                   7     TRUE            0.71
14 2019-05-20 18:00:00  2                   0     TRUE            0.75
15 2019-05-20 19:00:00  1                   4     TRUE            0.75
16 2019-05-20 19:00:00  2                   1     TRUE            0.80

Saya tahu ini rumit untuk dipahami, adakah yang tahu cara melakukannya?


person Dekike    schedule 08.07.2019    source sumber
comment
Mengapa Anda memiliki Times_seen_per_hour menjadi 0 tetapi Kehadiran adalah TRUE? Jika 0 bukankah seharusnya FALSE?   -  person Sotos    schedule 08.07.2019
comment
Bukankah ini mirip dengan pertanyaan sebelumnya?   -  person akrun    schedule 08.07.2019
comment
Terima kasih. Tidak, saya bekerja dengan ikan. Presence == TRUE berarti ikan tersebut berada di area yang saya minati dan Presence== FALSE berarti ikan tersebut berada di luar area tersebut. Namun ikan tersebut ada di daerah saya bukan berarti kami mendeteksinya dengan mata karena terkadang tersembunyi. Jadi, saya ingin mengetahui proporsi jam kita dapat melihat ikan tersebut dengan jumlah total jam kita mengetahui bahwa ikan tersebut ada di sana. Apakah kamu mengerti?   -  person Dekike    schedule 08.07.2019
comment
Kami membagi jumlah jam yang terlihat (terlihat 1 jam) - tetapi ID tersebut terlihat dalam delapan jam lainnya?   -  person zacdav    schedule 08.07.2019
comment
Perbedaannya dengan dataframe lain yang saya ajukan adalah di sini saya memiliki baris per individu dan per jam meskipun ikannya tidak ada. Jika Times_seen_per_hour adalah 0 dan Presence adalah FALSE berarti ikannya tidak ada. Namun jika Times_seen_per_hour adalah 0 dan Presence adalah TRUE, berarti ia ada dan kita tidak dapat melihatnya. Jadi saya harus mengatur hal-hal itu di sini untuk mendapatkan apa yang saya inginkan...   -  person Dekike    schedule 08.07.2019
comment
@zacdav, maksudku sampai baris ini. Apakah kamu mengerti? Pada jam 12:00:00 hewan tersebut dapat terlihat pada jam 12:00:00, jadi jumlah total jam yang dibutuhkan hewan tersebut untuk terlihat adalah 1. Untuk ID nomor 1 pada baris nomor 3, pada jam 13:00:00 dapat dilihat pada dua jam yang berbeda (pada jam 12:00:00 dan pada jam 13:00:00). Apakah kamu mengerti? Di setiap baris, saya mempertimbangkan waktu-waktu sebelumnya, bukan waktu-waktu yang datang kemudian.   -  person Dekike    schedule 08.07.2019


Jawaban (1)


Ini sepertinya sesuai dengan keluaran yang Anda inginkan. Berhati-hatilah karena ini mengasumsikan setiap jam akan memiliki baris 1:length(Datetime).

df1 %>%
  arrange(ID, Datetime) %>%
  group_by(ID) %>%
  mutate(hours_passed = 1:length(Datetime),
         hours_seen = cumsum(Times_seen_per_hour > 0),
         cumulative_presence = cumsum(Presence),
         prop_hours_seen = hours_seen / cumulative_presence,
         prop_hours_seen = ifelse(Presence, prop_hours_seen, NA)) %>%
  arrange(Datetime, ID)

Datetime               ID Times_seen_per_hour Presence prop_hours_seen
   <dttm>              <dbl>               <dbl> <lgl>              <dbl>
 1 2019-05-20 12:00:00     1                   3 TRUE               1    
 2 2019-05-20 12:00:00     2                   0 FALSE             NA    
 3 2019-05-20 13:00:00     1                   0 TRUE               0.5  
 4 2019-05-20 13:00:00     2                   4 TRUE               1    
 5 2019-05-20 14:00:00     1                   2 TRUE               0.667
 6 2019-05-20 14:00:00     2                   1 TRUE               1    
 7 2019-05-20 15:00:00     1                   3 TRUE               0.75 
 8 2019-05-20 15:00:00     2                   2 TRUE               1    
 9 2019-05-20 16:00:00     1                   1 TRUE               0.8  
10 2019-05-20 16:00:00     2                   0 FALSE             NA    
11 2019-05-20 17:00:00     1                   0 TRUE               0.667
12 2019-05-20 17:00:00     2                   0 FALSE             NA    
13 2019-05-20 18:00:00     1                   7 TRUE               0.714
14 2019-05-20 18:00:00     2                   0 TRUE               0.75 
15 2019-05-20 19:00:00     1                   4 TRUE               0.75 
16 2019-05-20 19:00:00     2                   1 TRUE               0.8 
person zacdav    schedule 08.07.2019
comment
@ zacdav, Tahukah Anda cara meringkas berdasarkan ID jumlah jam tertentu ikan tersebut terlihat dan jumlah total jam ikan tersebut berada di wilayah kita? - person Dekike; 08.07.2019