我目前有一个加速计的第二个数据,我需要按分钟平均(平均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)。这将允许我按整分钟汇总。
如果有一种更简单的方法来平均整分钟的值,而不需要我删除行,那可能会更容易。
答案 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评论建议的另一种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
由reprex package(v0.2.0)创建于2018-05-09。