r - 在数据框中添加条件变量,该变量考虑同一数据框的行之间的时间间隔
问题描述
我有一个数据框df1
,它以一小时的间隔总结动物在一个地方出现的次数。
举个例子:
df1<- data.frame(DateTime=c("2016-09-27 10:00:00","2016-09-27 10:00:00","2016-09-27 11:00:00","2016-09-27 11:00:00","2016-09-27 12:00:00","2016-09-27 12:00:00","2016-09-27 13:00:00","2016-09-27 13:00:00","2016-09-27 14:00:00","2016-09-27 14:00:00","2016-09-27 15:00:00","2016-09-27 15:00:00","2016-09-27 16:00:00","2016-09-27 16:00:00","2016-09-27 17:00:00","2016-09-27 17:00:00","2016-09-27 18:00:00","2016-09-27 18:00:00"),
AnimalID= c(8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9),
Times_seen=c(6,3,0,7,0,2,0,0,7,0,2,0,5,0,2,1,0,8))
> df1
DateTime AnimalID Times_seen
1 2016-09-27 10:00:00 8 6
2 2016-09-27 10:00:00 9 3
3 2016-09-27 11:00:00 8 0
4 2016-09-27 11:00:00 9 7
5 2016-09-27 12:00:00 8 0
6 2016-09-27 12:00:00 9 2
7 2016-09-27 13:00:00 8 0
8 2016-09-27 13:00:00 9 0
9 2016-09-27 14:00:00 8 7
10 2016-09-27 14:00:00 9 0
11 2016-09-27 15:00:00 8 2
12 2016-09-27 15:00:00 9 0
13 2016-09-27 16:00:00 8 5
14 2016-09-27 16:00:00 9 0
15 2016-09-27 17:00:00 8 2
16 2016-09-27 17:00:00 9 1
17 2016-09-27 18:00:00 8 0
18 2016-09-27 18:00:00 9 8
据此,我想添加一个新变量,df1
说明动物是否可能存在(如果你没有看到它并不意味着它不存在)。显然,如果Times_seen
大于 0,我们添加Yes
变量df1$Presence
。但是,当Times_seen
为 0 时,我想考虑两个选项:A)动物在那里但没有人看到它(然后,Presence
是Yes
),和 B)动物不在这个地方(然后,Presence
是No
)。
认为该动物不再在该地方的标准是:该动物的Times_seen
变量为 0,并且在前两个小时内没有在该地方看到它。
作为我期望得到的一个例子是:
> df1
DateTime AnimalID Times_seen Presence
1 2016-09-27 10:00:00 8 6 Yes
2 2016-09-27 10:00:00 9 3 Yes
3 2016-09-27 11:00:00 8 0 Yes
4 2016-09-27 11:00:00 9 7 Yes
5 2016-09-27 12:00:00 8 0 Yes
6 2016-09-27 12:00:00 9 2 Yes
7 2016-09-27 13:00:00 8 0 No
8 2016-09-27 13:00:00 9 0 Yes
9 2016-09-27 14:00:00 8 7 Yes
10 2016-09-27 14:00:00 9 0 Yes
11 2016-09-27 15:00:00 8 2 Yes
12 2016-09-27 15:00:00 9 0 No
13 2016-09-27 16:00:00 8 5 Yes
14 2016-09-27 16:00:00 9 0 No
15 2016-09-27 17:00:00 8 2 Yes
16 2016-09-27 17:00:00 9 1 Yes
17 2016-09-27 18:00:00 8 0 Yes
18 2016-09-27 18:00:00 9 8 Yes
有谁知道如何做到这一点?
解决方案
正如 akrun 在他的评论中指出的那样,这是我发现有用的代码:
df1<- df1 %>% mutate(DateTime = ymd_hms(DateTime)) %>%
group_by(AnimalID) %>%
mutate(Presence = map_lgl(DateTime, ~ any(Times_seen[dplyr::between(DateTime, .x - hours(2), .x + hours(0))] > 0)))
> df1
# A tibble: 18 x 4
# Groups: AnimalID [2]
DateTime AnimalID Times_seen Presence
<dttm> <dbl> <dbl> <lgl>
1 2016-09-27 10:00:00 8 6 TRUE
2 2016-09-27 10:00:00 9 3 TRUE
3 2016-09-27 11:00:00 8 0 TRUE
4 2016-09-27 11:00:00 9 7 TRUE
5 2016-09-27 12:00:00 8 0 TRUE
6 2016-09-27 12:00:00 9 2 TRUE
7 2016-09-27 13:00:00 8 0 FALSE
8 2016-09-27 13:00:00 9 0 TRUE
9 2016-09-27 14:00:00 8 7 TRUE
10 2016-09-27 14:00:00 9 0 TRUE
11 2016-09-27 15:00:00 8 2 TRUE
12 2016-09-27 15:00:00 9 0 FALSE
13 2016-09-27 16:00:00 8 5 TRUE
14 2016-09-27 16:00:00 9 0 FALSE
15 2016-09-27 17:00:00 8 2 TRUE
16 2016-09-27 17:00:00 9 1 TRUE
17 2016-09-27 18:00:00 8 0 TRUE
18 2016-09-27 18:00:00 9 8 TRUE
注意:该代码允许您指明要考虑在说No
in之前和之后的小时数df1$Presence
。
推荐阅读
- php - 如何将日期时间字符串转换为标准 mysql
- javascript - 无法阻止将重复项添加到数组中
- reactjs - 如何以 REACTJS 形式将图像上传到具有特定名称的 aws 3
- linux - Linux xfce 桌面启动器:运行嵌套命令
- javascript - 带有对象的数组,单击按钮后增加/减少对象中的值之一
- python - 给定 n 和特定排列 s,按元素 1-n 的字典顺序找到下一个排列(python)
- javascript - 将数组元素的所有排列查找为连接字符串
- javascript - js文件中的数组不会导出到表达
- docker - Docker 使用未定义的网络
- reactjs - 了解 Next.JS with-iron-sessions 在自己的环境中使用的要求