Как рассчитать процент времени просмотра в зависимости от переменных «Дата и время» и «Количество просмотров в час» - PullRequest
0 голосов
/ 08 июля 2019

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

Здесь 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

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

1 Ответ

1 голос
/ 08 июля 2019

Это, кажется, соответствует желаемому результату.Имейте в виду, это предполагает, что каждый час будет иметь строку 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 
...