Как оценить процент времени просмотра в зависимости от переменных Datetime и Количество просмотров в час

В этом сообщении (Как добавить переменную, которая оценивает долю дней, в течение которых кто-то был замечен с первого раза) Я спросил что-то с похожей конечной целью, но здесь фрейм данных совершенно другой.

Здесь df1 суммирует в час (Datetime) количество раз, когда определенное животное (ID) видели (Times_seen_per_hour) в определенной интересующей области. Поскольку мы знаем, было ли животное в этом районе в этот час, мы также создали столбец Presence, который указывает, было ли животное в районе, где мы можем его обнаружить.

Я хочу знать долю часов, в течение которых животное было обнаружено, по отношению к общему количеству часов, в течение которых, как мы знаем, животное находилось в этом районе.

Вот пример того, что у меня сейчас:

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

Как уже упоминалось, мне нужно создать новую переменную с именем Prop_hours_seen, которая указывает долю часов, в течение которых животное было замечено, относительно общего количества часов, в течение которых, как мы знаем, животное было там (Presence == TRUE).

Я ожидал бы этого:

> 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

Я знаю, что это сложно понять, кто-нибудь знает, как это сделать?


person Dekike    schedule 08.07.2019    source источник
comment
Почему у вас Times_seen_per_hour равно 0, а Присутствие равно TRUE? Если это 0, разве это не должно быть FALSE?   -  person Sotos    schedule 08.07.2019
comment
Разве это не похоже на предыдущий вопрос?   -  person akrun    schedule 08.07.2019
comment
Спасибо. Нет, я работаю с рыбами. Присутствие == ИСТИНА означает, что рыба была в интересующей меня области, а Присутствие == ЛОЖЬ означает, что рыба была вне этой области. Но то, что рыба находится в моем районе, не означает, что мы обнаружили ее глазами, потому что иногда они скрыты. Итак, я хочу знать долю часов, в течение которых мы можем видеть рыбу, по отношению к общему количеству часов, в течение которых мы знаем, что рыба там. Вы понимаете?   -  person Dekike    schedule 08.07.2019
comment
Делим количество увиденных часов (было увидено 1 час) - но этот ID увиден за восемь других часов?   -  person zacdav    schedule 08.07.2019
comment
Разница с другими фреймами данных, которые я представил, заключается в том, что здесь у меня есть строка на человека и в час, хотя рыбы там нет. Если Times_seen_per_hour равно 0, а Presence равно FALSE, значит рыбы там не было. Но если Times_seen_per_hour это 0, а Presence это TRUE, значит, он был там и мы его не видели. Так что я должен управлять этими вещами здесь, чтобы получить то, что я хочу...   -  person Dekike    schedule 08.07.2019
comment
@zacdav, я имел в виду до этой строки. Вы понимаете? В 12:00:00 животное можно было увидеть в 12:00:00, поэтому общее количество часов, в течение которых животное можно было увидеть, равно 1. Для ID числа 1 в строке номер 3 в 13:00:00 можно было увидеть два разных часа (в 12:00:00 и в 13:00:00). Вы понимаете? В каждом ряду я учитываю время до, а не время после.   -  person Dekike    schedule 08.07.2019


Ответы (1)


Кажется, это соответствует желаемому результату. Имейте в виду, что предполагается, что каждый час будет иметь строку 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, Вы знаете, как суммировать по ID количество отчетливых часов, что рыба была замечена, и общее количество часов, что рыба была в нашем районе? - person Dekike; 08.07.2019