【问题标题】:Add a conditional variable in a data frame that takes into account the time intervals between rows for the same data frame在数据框中添加条件变量,该变量考虑同一数据框的行之间的时间间隔
【发布时间】: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)动物在那里,但没有人看到它(然后,PresenceYes),以及 B)动物不在其中放置(然后,PresenceNo)。

认为该动物已不在该地方的标准是:该动物的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 %&gt;% mutate(DateTime = ymd_hms(DateTime)) %&gt;% group_by(AnimalID) %&gt;% mutate(Presence = map_lgl(DateTime, ~ any(Times_seen[dplyr::between(DateTime, .x - hours(2), .x + hours(2))] &gt; 0)))
  • 您对presence 列有一个循环定义。你想按时间顺序处理吗?如果是,则不考虑前两个小时。
  • @akrun,正如 Alexandre B. 向我推荐的那样,我已经修改了标准,而不是之前或之后的两个小时,我认为最好只考虑之前的两个小时......在这种情况下,在示例中,变量 Presence 中只有第 7 行应该有一个 No

标签: r dplyr tidyverse lubridate


【解决方案1】:

正如 akrun 在他的一个 cmets 中指出的那样,这是我发现有用的代码:

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    

注意:代码允许您在df1$Presence 中指明您在说出No 之前和之后要考虑的小时数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2020-07-03
    • 2020-07-13
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多