如何在第一分钟之前删除秒数

时间:2018-05-09 19:03:21

标签: r aggregate mean lubridate

我目前有一个加速计的第二个数据,我需要按分钟平均(平均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)。这将允许我按整分钟汇总。

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

2 个答案:

答案 0 :(得分:1)

由于您使用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"))

如果你只是想保持观察的全部时间&#34;,就像你所说的那样,那么请保留观察时的时间戳,这些时间戳是按分钟铺设时相同的。

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

如果您没有完全匹配地板时间戳的观察结果,但您希望保留最接近&#34;整个分钟&#34;的观察结果,那么您可以按时间戳排列它们并保持每分钟内的第一个。

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

如果你想要按分钟聚合一些变量x,比如说取平均值,然后用一个内置的时间戳分组。

{{1}}

答案 1 :(得分:0)

这是使用Gregor评论建议的另一种lubridatetidyverse方法。由于我们希望整个分钟观测有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

reprex package(v0.2.0)创建于2018-05-09。