Значение скользящего окна с отсутствующими данными в R - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь найти значение скользящего окна для данных акселерометра для каждого животного. Акселерометры были установлены на нескольких животных, и они включались и выключались в течение дня, поэтому это не непрерывный сигнал. Они записывают со скоростью 10 Гц, или 10 значений в секунду ... так что вы увидите ниже, что у моего datetime есть доли секунды. Там, где нет доступных данных, я хочу, чтобы они просто использовали доступные данные. Я хотел бы 2-секундное окно, которое смотрит на обе стороны текущего времени. Поэтому, если дата и время находятся на грани, у него будет только 1 секунда значений, влияющих на его среднее значение.

animalID <- c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
  "b", "b", "b", "b", "b",
  "c", "c", "c", "c", "c" )

datetime <- as.POSIXct(c("2014-01-19 09:11:18.313 PST", #a
                         "2014-01-19 09:11:18.411,PST", 
                         "2014-01-19 09:11:18.509 PST",
                         "2014-01-19 09:11:18.608 PST", 
                         "2014-01-19 09:11:19.706 PST", 
                         "2014-01-19 09:11:19.803 PST",
                         "2014-01-19 09:11:19.901 PST",
                         "2014-01-19 09:11:20.000 PST", 
                         "2014-01-19 09:11:20.098 PST",
                         "2014-01-19 09:11:20.196 PST", 
                         "2014-01-19 09:11:18.313 PST", #b
                         "2014-01-19 09:11:19.391 PST",
                         "2014-01-19 09:15:20.490 PST", 
                         "2014-01-19 09:15:20.588 PST", 
                         "2014-01-19 09:15:20.686 PST",
                         "2014-01-19 09:11:20.783 PST", #c
                         "2014-01-19 09:11:20.881 PST", 
                         "2014-01-19 09:11:20.980 PST",
                         "2014-01-19 09:11:21.078 PST", 
                         "2014-01-19 09:11:21.176 PST"))

accx <- c(111, 109, 110, 110, 110, 110, 110, 110, 110, 110, 
          87, 89, 87, 89, 88, 
          98, 100, 98, 100, 99)

accy <- c(10, 11, 10, 10, 10, 9, 10, 10, 10, 10, 
          21, 24, 21, 24, 22, 
          32, 34, 32, 34, 33)

df <- data.frame(animalID, datetime, accx, accy)

# example of how I would generally like this to perform
# for animal == a, datetime == 2014-01-19 09:11:19.803 PST
window <- 2
i <- 6
starttime <- df<span class="math-container">$datetime[i] - window/2
endtime <- df$</span>datetime[i] + window/2
interval <- df[df<span class="math-container">$datetime >= starttime &
                         df$</span>datetime < endtime, c("accx", "accy")]

interval %>% summarise_each(list(mean))

Я посмотрел на filter (), filterfilt (), tsibble, movingaves (), tidyquant () и другие. Я изо всех сил, потому что несколько животных могут иметь данные за одни и те же даты, поэтому я не могу просто индексировать, используя столбец datetime. И я не могу найти пример, который использует доли секунды. Я видел некоторые решения, которые используют fill_gaps () и другие функции для заполнения недостающих данных и создания непрерывного сигнала, но у меня есть 100 животных с данными о 10 днях на животное, поэтому заполнение пробелов кажется неэффективным. Любая помощь приветствуется!

...