Расчет временного промежутка между последовательными событиями после группировки для подмножеств - PullRequest
1 голос
/ 16 мая 2019

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

Подмножество моих данных выглядит так:

head(d1) #visualize the first few lines of the data

date       time   year    km sps      pp datetime          prev  timedif   seque
<fct>      <fct> <int> <dbl> <fct> <dbl> <chr>            <dbl>    <dbl>   <chr>
2012/06/09 2:22   2012   110 MICRO     0 2012-06-09 02:22     0   260.    00
2012/06/19 2:19   2012    80 MICRO     0 2012-06-19 02:19     1  4144     01
2012/06/19 22:15  2012   110 MICRO     0 2012-06-19 22:15     0   100.    00
2012/06/21 23:23  2012    80 MUXX      1 2012-06-21 23:23     0 33855     10
2012/06/24 2:39   2012   110 MICRO     0 2012-06-24 02:39     0   120.    00
2012/06/29 2:14   2012   110 MICRO     0 2012-06-29 02:14     0    43.7   00

Где:

  • pp: какие виды (sps) являются хищниками (закодированы как 1), а какие являются жертвами (закодированы как 0)
  • prev: совсем рядом pp после текущего наблюдения
  • timedif: разница во времени (в секундах?) Между текущим наблюдением и следующим
  • seque: это порядок последовательности: где первое число является текущим pp, а второечисло следующее pp

Чтобы сгенерировать столбец datetime, я сделал это:

d1$datetime=strftime(paste(d1$date,d1$time),'%Y-%m-%d %H:%M',usetz=FALSE) #converting the date/time into a new format

Для создания других столбцов я использовал следующий код:

d1 = d1 %>% 
    ungroup() %>% 
    group_by(km, year) %>% #group by km and year because I don't want time differences calculated between different years or km (i.e., locations)
    arrange(datetime)%>%
    mutate(next = dplyr::lead(pp)) %>% 
    mutate(timedif = lead(as.POSIXct(datetime))-as.numeric(as.POSIXct(datetime)))
d1 = d1[2:nrow(d1),] %>% mutate(seque = as.factor(paste0(pp,prev)))

Затем я могу извлечь среднее (среднее геометрическое) время между последовательностями:

library(psych)
geo_avg = d1 %>% group_by(seque) %>% summarise(geometric.mean(timedif))

geo_avg 
# A tibble: 6 x 2
  seque `geometric.mean(timedif)`
  <chr>           <dbl>
1 00             58830. #prey followed by a prey
2 01            147062. #prey followed by a predator
3 0NA               NA  #prey followed by nothing (end of time series)
4 10            178361. #predator followed by prey
5 11              1820. #predator followed by predator
6 1NA               NA  #predator followed by nothing (end of time series)

У меня есть один вопрос, который можно разбить на три части

  • Как рассчитать разницу во времени между:

    1. лицами одного и того же sps (например, как долгоs для того, чтобы за одной MICRO последовали следующие MICRO
    2. видоспецифичного времени для противоположных классификаций хищников (01 или 10) для каждой жертвы (pp= 0) или хищник (pp = 1) sps (например, сколько времени занимает добыча MICRO, за которой следует другой хищник (pp = 1).
    3. видоспецифичное время для одинаковых классификационных (00 или 11) последовательностей для каждой добычи (pp = 0) или хищника (pp = 1) sps (например, сколько времени требуется дляза добычей MICRO, за которой должна следовать любая другая добыча (pp = 0), MICRO и т. д.

Я бы хотел что-то сделатьвдоль этих линий:

sps    pp    same_sps     same_class   opposite_class   
MICRO  0     10 days      5 days       2 days    
MUXX   1     15 days      20 days      12 days
etc

На всякий случай вот вывод для dput(d1[1:10,]):

structure(list(
 date = structure(c(11L, 21L, 21L, 23L, 26L, 31L,32L, 37L, 38L, 39L), .Label = c("2012/05/30", "2012/05/31", "2012/06/01", "2015/08/19", "2015/08/20"), class = "factor"), 
 time = structure(c(742L, 739L, 915L, 983L, 759L, 734L, 897L, 769L, 901L, 14L), .Label = c("0:00", "0:01", "0:02", "0:03", "9:58", "9:59"), class = "factor"), 
 year = c(2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L), 
 km = c(110, 80, 110, 80, 110, 110, 110, 110, 110, 110), 
 sps = structure(c(9L, 9L, 9L, 11L, 9L, 9L, 9L, 9L, 9L, 9L), .Label = c("CACA", "ERDO", "FEDO", "LEAM", "LOCA", "MAAM", "MAMO", "MEME", "MICRO", "MUVI", "MUXX", "ONZI", "PRLO", "TAHU", "TAST", "URAM", "VUVU"), class = "factor"), 
 pp = c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0), 
 datetime = c("2012-06-09 02:22", "2012-06-19 02:19", "2012-06-19 22:15", "2012-06-21 23:23"), 
 prev = c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0), 
 timedif = c(259.883333333333, 4144, 100.4, 43.2, 2.2, 453.083333333333), 
 seque = c("00", "01", "00", "10", "00", "00", "00", "00", "00", "00")), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L), 
groups = structure(list(km = c(80, 110), year = c(2012L, 2012L), .rows = list(c(2L, 4L), c(1L, 3L, 5L, 6L, 7L, 8L, 9L, 10L))), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

1 Ответ

0 голосов
/ 17 мая 2019

Я полагаю, что вы могли бы ответить на все три вопроса, добавив столбец для следующих процедур и включив его и текущих операторов в свои group_by

d1 %>% 
  mutate(next_sps = lead(sps)) %>% 
  group_by(sps, next_sps, seque) %>% 
  summarise(AvgTime = mean(timedif))

# A tibble: 5 x 4
# Groups:   sps, next_sps [?]
sps   next_sps seque   AvgTime
<fct> <fct>    <chr>     <dbl>
1 MICRO MICRO    00    1.19e+  2
2 MICRO MICRO    01    4.14e+  3
3 MICRO MUXX     00    1.00e+  2
4 MICRO NA       00    1.01e-317
5 MUXX  MICRO    10    4.32e+  1
...