Поскольку вы пометили это как 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()