【发布时间】:2019-05-24 20:29:31
【问题描述】:
我有一个数据框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,我们在变量df1$Presence中添加Yes。但是,当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
有人知道怎么做吗?
【问题讨论】:
-
“存在”列是否正确,因为通过检查第 7 行,对我来说是“是”。因为如果我检查前两个小时和后两个小时,它会是
0 0 0 7 -
你是对的阿克伦。第 7 行是
Yes,因为在14:00:00(不到 2 小时)检测到同一只动物。对不起这个错误。我已经修改过了。而且我认为第 5 行可能是一样的,不是吗?因为前两小时“0观察”的条件不符合…… -
由于某种原因,如果我使用条件,我得到所有 TRUE
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(2))] > 0))) -
您对
presence列有一个循环定义。你想按时间顺序处理吗?如果是,则不考虑前两个小时。 -
@akrun,正如 Alexandre B. 向我推荐的那样,我已经修改了标准,而不是之前或之后的两个小时,我认为最好只考虑之前的两个小时......在这种情况下,在示例中,变量
Presence中只有第 7 行应该有一个No。
标签: r dplyr tidyverse lubridate