首页 > 解决方案 > 如何在第一个完整分钟之前删除秒数

问题描述

我目前有来自加速度计的逐秒数据,我需要按分钟平均(平均 60 秒)。问题是我在第一分钟和最后一分钟的开始和结束时都有数据,而不是整分钟。我想删除那些秒,所以当我按分钟平均时,它总是在分钟开始和停止。我的数据也是多个参与者堆叠在一起,所以我需要通过 id 来执行此操作。下面是我的数据布局方式的一个示例:

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

等等

希望我能做到这一点,我可以消除每个 ID 的斜体行,这样我每个人只有整整几分钟的时间。(我每个数据帧大约有 80-95 个 ID)。这将允许我按整分钟汇总。

如果有一种更简单的方法来平均整分钟的值而不需要我删除行,那可能会更容易。

标签: raggregatemeanlubridate

解决方案


既然你用 标记了这个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()

推荐阅读