Как убрать секунды до первой полной минуты - PullRequest
0 голосов
/ 09 мая 2018

У меня в настоящее время есть секунда за секундой данные от акселерометра, которые мне нужно усреднять по минутам (в среднем 60 секунд вместе).Проблема в том, что у меня есть данные в начале и конце первой и последней минуты, которые не являются целыми минутами.Я хочу убрать эти секунды, чтобы при усреднении по минутам он всегда начинался и останавливался на минуте.Мои данные также представляют собой несколько участников, расположенных друг над другом, поэтому мне нужно будет сделать это по идентификатору.Пример размещения моих данных приведен ниже:

ID    Timestamp
*1     2017-03-15 10:29:58
1     2017-03-15 10:29:59*
1     2017-03-15 10:30:00
1     2017-03-15 10:30:01
...
*1     2017-03-15 12:48:00*
*1     2017-03-15 12:48:01*
*1     2017-03-15 12:48:02*
*2     2017-04-01 11:19:59*
2      2017-03-15 11:20:00

и т. Д.

Надеюсь, я смогу сделать это, если смогу удалить выделенные курсивом строки для каждого идентификатора, поэтому у меня есть только целые минуты.для каждого человека.(У меня есть около 80-95 идентификаторов на каждый кадр данных).Это позволит мне агрегировать по всей минуте.

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

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

library(tidyverse)
library(lubridate)
tbl <- tibble(
  time = ymd_hms("2017-03-15 10:29:57") + 1:66
)
head(tbl)
#> # A tibble: 6 x 1
#>   time               
#>   <dttm>             
#> 1 2017-03-15 10:29:58
#> 2 2017-03-15 10:29:59
#> 3 2017-03-15 10:30:00
#> 4 2017-03-15 10:30:01
#> 5 2017-03-15 10:30:02
#> 6 2017-03-15 10:30:03
tail(tbl)
#> # A tibble: 6 x 1
#>   time               
#>   <dttm>             
#> 1 2017-03-15 10:30:58
#> 2 2017-03-15 10:30:59
#> 3 2017-03-15 10:31:00
#> 4 2017-03-15 10:31:01
#> 5 2017-03-15 10:31:02
#> 6 2017-03-15 10:31:03
tbl %>%
  mutate(minute = minute(time)) %>%
  group_by(minute) %>%
  filter(n() == 60)
#> # A tibble: 60 x 2
#> # Groups:   minute [1]
#>    time                minute
#>    <dttm>               <int>
#>  1 2017-03-15 10:30:00     30
#>  2 2017-03-15 10:30:01     30
#>  3 2017-03-15 10:30:02     30
#>  4 2017-03-15 10:30:03     30
#>  5 2017-03-15 10:30:04     30
#>  6 2017-03-15 10:30:05     30
#>  7 2017-03-15 10:30:06     30
#>  8 2017-03-15 10:30:07     30
#>  9 2017-03-15 10:30:08     30
#> 10 2017-03-15 10:30:09     30
#> # ... with 50 more rows

Создано в 2018-05-09 пакетом Представ (v0.2.0).

0 голосов
/ 09 мая 2018

Поскольку вы пометили это как lubridate, вот решение lubridate / tidyverse. (Если я правильно понял ваш вопрос.)

library(tidyverse)
library(lubridate)


df <- tibble::tribble(
  ~id,            ~timestamp,
  1, "2017-03-15 10:29:58",
  1, "2017-03-15 10:29:59",
  1, "2017-03-15 10:30:00",
  1, "2017-03-15 10:30:01",
  1, "2017-03-15 12:48:00",
  1, "2017-03-15 12:48:01",
  1, "2017-03-15 12:48:02",
  2, "2017-04-01 11:19:59",
  2, "2017-03-15 11:20:00"
    ) %>%
  mutate(
    timestamp = as_datetime(timestamp),
    x = rnorm(n())                    # some var you want aggregate
  )

Если вы просто хотите сохранить наблюдения «целой минуты», как вы их называете, то сохраняйте наблюдения с отметками времени, которые одинаковы при разбивке по минутам.

df %>%
  filter(timestamp == floor_date(timestamp, "minute"))

Если у вас нет наблюдений, точно совпадающих с отметкой времени по полу, но вы хотите сохранить наблюдения, которые находятся ближе всего к «целой минуте», то вы можете расположить их по отметке времени и сохранить первое в каждой минуте.

df %>%
  arrange(timestamp) %>%
  mutate(min = floor_date(timestamp, "minute")) %>%
  group_by(min, id) %>%
  slice(1) %>%
  ungroup()

Если вы хотите агрегировать некоторую переменную x по минутам, скажем, взять среднее значение, то сгруппируйте по временной метке.

df %>%
  mutate(min = floor_date(timestamp, "minute")) %>%
  group_by(min, id) %>%
  summarize(mean_var = mean(var)) %>%
  ungroup()
...