Добавьте условную переменную во фрейм данных, которая учитывает временные интервалы между строками для одного и того же фрейма данных. - PullRequest
0 голосов
/ 24 мая 2019

У меня есть кадр данных df1, который суммирует с интервалом в один час, сколько раз животное было замечено в каком-либо месте.

Например:

df1<- data.frame(DateTime=c("2016-09-27 10:00:00","2016-09-27 10:00:00","2016-09-27 11:00:00","2016-09-27 11:00:00","2016-09-27 12:00:00","2016-09-27 12:00:00","2016-09-27 13:00:00","2016-09-27 13:00:00","2016-09-27 14:00:00","2016-09-27 14:00:00","2016-09-27 15:00:00","2016-09-27 15:00:00","2016-09-27 16:00:00","2016-09-27 16:00:00","2016-09-27 17:00:00","2016-09-27 17:00:00","2016-09-27 18:00:00","2016-09-27 18:00:00"),
                 AnimalID= c(8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9),
                 Times_seen=c(6,3,0,7,0,2,0,0,7,0,2,0,5,0,2,1,0,8))

> df1
              DateTime AnimalID Times_seen
1  2016-09-27 10:00:00        8          6
2  2016-09-27 10:00:00        9          3
3  2016-09-27 11:00:00        8          0
4  2016-09-27 11:00:00        9          7
5  2016-09-27 12:00:00        8          0
6  2016-09-27 12:00:00        9          2
7  2016-09-27 13:00:00        8          0
8  2016-09-27 13:00:00        9          0
9  2016-09-27 14:00:00        8          7
10 2016-09-27 14:00:00        9          0
11 2016-09-27 15:00:00        8          2
12 2016-09-27 15:00:00        9          0
13 2016-09-27 16:00:00        8          5
14 2016-09-27 16:00:00        9          0
15 2016-09-27 17:00:00        8          2
16 2016-09-27 17:00:00        9          1
17 2016-09-27 18:00:00        8          0
18 2016-09-27 18:00:00        9          8

В соответствии с этим, я хочу добавить новую переменную в df1, которая говорит, может ли животное быть там или нет (если вы не видите, это не значит, что его там не было).Очевидно, что если Times_seen больше 0, мы добавляем Yes в переменную df1$Presence.Но когда Times_seen равно 0, я хочу рассмотреть два варианта: A) животное было там, но никто его не видел (и тогда Presence - Yes), и B) животное не было в этомместо (а затем, Presence - это No).

Критерии для того, чтобы считать, что животного больше нет в этом месте: переменная Times_seen животного равна 0, и ее не видели вэто место в ПРЕДЫДУЩЕМ двух часах.

В качестве примера того, что я ожидал бы получить, это:

> df1
              DateTime AnimalID Times_seen Presence
1  2016-09-27 10:00:00        8          6      Yes
2  2016-09-27 10:00:00        9          3      Yes
3  2016-09-27 11:00:00        8          0      Yes
4  2016-09-27 11:00:00        9          7      Yes
5  2016-09-27 12:00:00        8          0      Yes
6  2016-09-27 12:00:00        9          2      Yes
7  2016-09-27 13:00:00        8          0       No
8  2016-09-27 13:00:00        9          0      Yes
9  2016-09-27 14:00:00        8          7      Yes
10 2016-09-27 14:00:00        9          0      Yes
11 2016-09-27 15:00:00        8          2      Yes
12 2016-09-27 15:00:00        9          0       No
13 2016-09-27 16:00:00        8          5      Yes
14 2016-09-27 16:00:00        9          0       No
15 2016-09-27 17:00:00        8          2      Yes
16 2016-09-27 17:00:00        9          1      Yes
17 2016-09-27 18:00:00        8          0      Yes
18 2016-09-27 18:00:00        9          8      Yes

Кто-нибудь знает, как это сделать?

1 Ответ

2 голосов
/ 25 мая 2019

Как указал Акрун в одном из своих комментариев, этот код я нашел полезным:

df1<- df1 %>% mutate(DateTime = ymd_hms(DateTime)) %>% 
  group_by(AnimalID) %>% 
  mutate(Presence = map_lgl(DateTime, ~ any(Times_seen[dplyr::between(DateTime, .x - hours(2), .x + hours(0))] > 0)))

> df1
# A tibble: 18 x 4
# Groups:   AnimalID [2]
   DateTime            AnimalID Times_seen Presence
   <dttm>                 <dbl>      <dbl> <lgl>   
 1 2016-09-27 10:00:00        8          6 TRUE    
 2 2016-09-27 10:00:00        9          3 TRUE    
 3 2016-09-27 11:00:00        8          0 TRUE    
 4 2016-09-27 11:00:00        9          7 TRUE    
 5 2016-09-27 12:00:00        8          0 TRUE    
 6 2016-09-27 12:00:00        9          2 TRUE    
 7 2016-09-27 13:00:00        8          0 FALSE   
 8 2016-09-27 13:00:00        9          0 TRUE    
 9 2016-09-27 14:00:00        8          7 TRUE    
10 2016-09-27 14:00:00        9          0 TRUE    
11 2016-09-27 15:00:00        8          2 TRUE    
12 2016-09-27 15:00:00        9          0 FALSE   
13 2016-09-27 16:00:00        8          5 TRUE    
14 2016-09-27 16:00:00        9          0 FALSE   
15 2016-09-27 17:00:00        8          2 TRUE    
16 2016-09-27 17:00:00        9          1 TRUE    
17 2016-09-27 18:00:00        8          0 TRUE    
18 2016-09-27 18:00:00        9          8 TRUE    

Примечание: код позволяет указать количество часов, которое вы хотите учесть до и после высказывания No в df1$Presence.

...