自第一次观察 R 以来的持续时间过滤数据集
Filter dataset for duration of time since first observation R
我将如何过滤数据集以删除超过特定持续时间的所有观测值和低于特定阈值的任何分组观测值 (focal_id
)?我的问题在原则上与此类似 OP.
这是数据集的示例:
focal_id time first_time
1 9128 08:40:30 08:40:30
2 9128 08:40:57 08:40:30
3 9128 08:41:27 08:40:30
4 9128 08:41:57 08:40:30
5 9128 08:42:27 08:40:30
6 9128 08:42:57 08:40:30
7 9128 08:43:27 08:40:30
8 9128 08:43:57 08:40:30
9 9128 08:44:17 08:40:30
10 9128 08:44:29 08:40:30
11 9128 08:44:29 08:40:30
12 9128 08:45:06 08:40:30
13 9128 08:45:28 08:40:30
14 9128 08:46:32 08:40:30
15 9128 08:46:58 08:40:30
16 9128 08:47:28 08:40:30
17 9128 08:47:28 08:40:30
18 9128 08:48:00 08:40:30
19 9128 08:48:30 08:40:30
20 9128 08:48:31 08:40:30
21 1022 06:20:02 06:20:02
22 1022 06:20:32 06:20:02
23 1022 06:21:00 06:20:02
24 1022 06:21:34 06:20:02
在上面的例子中,我想过滤掉 7 分 15 秒后(从第一次开始)的所有观察结果(即行)和少于 5 分 30 秒的任何 focal_id
第一次观察(即行)的数量。
第一步,我使用 dplyr 执行以下操作:
filter_dataset<-dataset %>%
group_by(focal_id) %>%
arrange(time) %>%
mutate(first_time=min(time))
必须有一种方法来计算持续时间(然后我可以用它来过滤 focal_id
小于 5 分 30 秒的观察值),还可以过滤大于 7 分 15 秒的观察值 focal_id
持续时间超过 7 分 15 秒。
我尝试在 lubridate
包中工作,首先将我的时间设置为 hms
,但这只返回秒数。我也尝试了 lubridate
包中的 duration
函数,但它返回了 NAs.
这是我想要的最终输出:
focal_id time duration
1 9128 08:40:30 00:06:58
2 9128 08:40:57 00:06:58
3 9128 08:41:27 00:06:58
4 9128 08:41:57 00:06:58
5 9128 08:42:27 00:06:58
6 9128 08:42:57 00:06:58
7 9128 08:43:27 00:06:58
8 9128 08:43:57 00:06:58
9 9128 08:44:17 00:06:58
10 9128 08:44:29 00:06:58
11 9128 08:44:29 00:06:58
12 9128 08:45:06 00:06:58
13 9128 08:45:28 00:06:58
14 9128 08:46:32 00:06:58
15 9128 08:46:58 00:06:58
16 9128 08:47:28 00:06:58
17 9128 08:47:28 00:06:58
在下面的代码中,如果您想将 duration
保留为持续时间(而不是时间),请删除 as_hms()
.
library(tidyverse)
library(hms)
dataframe %>%
mutate(time=as_hms(time),
first_time=as_hms(first_time)) %>%
filter(time - first_time < 7.25*60) %>%
group_by(focal_id) %>%
mutate(duration = as_hms(max(time - first_time))) %>%
filter(duration > 5.5*60)
focal_id time first_time duration
<int> <time> <time> <time>
1 9128 08:40:30 08:40:30 06'58"
2 9128 08:40:57 08:40:30 06'58"
3 9128 08:41:27 08:40:30 06'58"
4 9128 08:41:57 08:40:30 06'58"
5 9128 08:42:27 08:40:30 06'58"
6 9128 08:42:57 08:40:30 06'58"
7 9128 08:43:27 08:40:30 06'58"
8 9128 08:43:57 08:40:30 06'58"
9 9128 08:44:17 08:40:30 06'58"
10 9128 08:44:29 08:40:30 06'58"
11 9128 08:44:29 08:40:30 06'58"
12 9128 08:45:06 08:40:30 06'58"
13 9128 08:45:28 08:40:30 06'58"
14 9128 08:46:32 08:40:30 06'58"
15 9128 08:46:58 08:40:30 06'58"
16 9128 08:47:28 08:40:30 06'58"
17 9128 08:47:28 08:40:30 06'58"
我将如何过滤数据集以删除超过特定持续时间的所有观测值和低于特定阈值的任何分组观测值 (focal_id
)?我的问题在原则上与此类似 OP.
这是数据集的示例:
focal_id time first_time
1 9128 08:40:30 08:40:30
2 9128 08:40:57 08:40:30
3 9128 08:41:27 08:40:30
4 9128 08:41:57 08:40:30
5 9128 08:42:27 08:40:30
6 9128 08:42:57 08:40:30
7 9128 08:43:27 08:40:30
8 9128 08:43:57 08:40:30
9 9128 08:44:17 08:40:30
10 9128 08:44:29 08:40:30
11 9128 08:44:29 08:40:30
12 9128 08:45:06 08:40:30
13 9128 08:45:28 08:40:30
14 9128 08:46:32 08:40:30
15 9128 08:46:58 08:40:30
16 9128 08:47:28 08:40:30
17 9128 08:47:28 08:40:30
18 9128 08:48:00 08:40:30
19 9128 08:48:30 08:40:30
20 9128 08:48:31 08:40:30
21 1022 06:20:02 06:20:02
22 1022 06:20:32 06:20:02
23 1022 06:21:00 06:20:02
24 1022 06:21:34 06:20:02
在上面的例子中,我想过滤掉 7 分 15 秒后(从第一次开始)的所有观察结果(即行)和少于 5 分 30 秒的任何 focal_id
第一次观察(即行)的数量。
第一步,我使用 dplyr 执行以下操作:
filter_dataset<-dataset %>%
group_by(focal_id) %>%
arrange(time) %>%
mutate(first_time=min(time))
必须有一种方法来计算持续时间(然后我可以用它来过滤 focal_id
小于 5 分 30 秒的观察值),还可以过滤大于 7 分 15 秒的观察值 focal_id
持续时间超过 7 分 15 秒。
我尝试在 lubridate
包中工作,首先将我的时间设置为 hms
,但这只返回秒数。我也尝试了 lubridate
包中的 duration
函数,但它返回了 NAs.
这是我想要的最终输出:
focal_id time duration
1 9128 08:40:30 00:06:58
2 9128 08:40:57 00:06:58
3 9128 08:41:27 00:06:58
4 9128 08:41:57 00:06:58
5 9128 08:42:27 00:06:58
6 9128 08:42:57 00:06:58
7 9128 08:43:27 00:06:58
8 9128 08:43:57 00:06:58
9 9128 08:44:17 00:06:58
10 9128 08:44:29 00:06:58
11 9128 08:44:29 00:06:58
12 9128 08:45:06 00:06:58
13 9128 08:45:28 00:06:58
14 9128 08:46:32 00:06:58
15 9128 08:46:58 00:06:58
16 9128 08:47:28 00:06:58
17 9128 08:47:28 00:06:58
在下面的代码中,如果您想将 duration
保留为持续时间(而不是时间),请删除 as_hms()
.
library(tidyverse)
library(hms)
dataframe %>%
mutate(time=as_hms(time),
first_time=as_hms(first_time)) %>%
filter(time - first_time < 7.25*60) %>%
group_by(focal_id) %>%
mutate(duration = as_hms(max(time - first_time))) %>%
filter(duration > 5.5*60)
focal_id time first_time duration <int> <time> <time> <time> 1 9128 08:40:30 08:40:30 06'58" 2 9128 08:40:57 08:40:30 06'58" 3 9128 08:41:27 08:40:30 06'58" 4 9128 08:41:57 08:40:30 06'58" 5 9128 08:42:27 08:40:30 06'58" 6 9128 08:42:57 08:40:30 06'58" 7 9128 08:43:27 08:40:30 06'58" 8 9128 08:43:57 08:40:30 06'58" 9 9128 08:44:17 08:40:30 06'58" 10 9128 08:44:29 08:40:30 06'58" 11 9128 08:44:29 08:40:30 06'58" 12 9128 08:45:06 08:40:30 06'58" 13 9128 08:45:28 08:40:30 06'58" 14 9128 08:46:32 08:40:30 06'58" 15 9128 08:46:58 08:40:30 06'58" 16 9128 08:47:28 08:40:30 06'58" 17 9128 08:47:28 08:40:30 06'58"