首页 > 解决方案 > 使用列的场合创建检测器使用表

问题描述

我需要创建一个检测器使用表,其中行是单个检测器,列是它们都处于活动状态的完整日期范围。在该表中,1 表示检测器在给定日期处于活动状态,0 表示检测器处于非活动状态。陷阱在由“站点”划定的组中被激活(例如站点:A1、B1、C1)。列中的连续日期范围需要从第一个陷阱处于活动状态的第一天开始,到最后一个陷阱处于活动状态的最后一天结束。

目前我有以下数据表可以使用

场地使用表:

  > site.use.df
   site     first      last
1:   B1 1/11/2017 1/12/2017
2:   B1 1/15/2017 1/16/2017
3:   P1  1/7/2017  1/8/2017
4:   P1 1/13/2017 1/14/2017
5:   R1 1/10/2017 1/11/2017
6:   R1 1/15/2017 1/16/2017

陷阱ID表:

> trapID.df
    trapID site
 1:    154   P1
 2:    155   P1
 3:    156   P1
 4:    157   P1
 5:    158   P1
 6:    304   R1
 7:    305   R1
 8:    306   R1
 9:    307   R1
10:    308   R1
11:      1   B1
12:      2   B1
13:      3   B1
14:      4   B1
15:      5   B1

理想情况下,完整的日期范围将从网站使用表中获取,而不是手动输入。

我正在寻找的最终产品将如下所示:

 > detector.table
    trapID site 1/7/2017 1/8/2017 1/9/2017 1/10/2017 1/11/2017 1/12/2017 1/13/2017 1/14/2017 1/15/2017 1/16/2017
 1:      1   B1        0        0        0         0         1         1         0         0         1         1
 2:      2   B1        0        0        0         0         1         1         0         0         1         1
 3:      3   B1        0        0        0         0         1         1         0         0         1         1
 4:      4   B1        0        0        0         0         1         1         0         0         1         1
 5:      5   B1        0        0        0         0         1         1         0         0         1         1
 6:    154   P1        1        1        0         0         0         0         1         1         0         0
 7:    155   P1        1        1        0         0         0         0         1         1         0         0
 8:    156   P1        1        1        0         0         0         0         1         1         0         0
 9:    157   P1        1        1        0         0         0         0         1         1         0         0
10:    158   P1        1        1        0         0         0         0         1         1         0         0
11:    304   R1        0        0        0         1         1         0         0         0         1         1
12:    305   R1        0        0        0         1         1         0         0         0         1         1
13:    306   R1        0        0        0         1         1         0         0         0         1         1
14:    307   R1        0        0        0         1         1         0         0         0         1         1
15:    308   R1        0        0        0         1         1         0         0         0         1         1

标签: rrmark

解决方案


如果我对您的理解正确,使用我们可以在和列tidyverse之间创建一系列日期,并以创建 1/0 列的宽格式获取数据。firstlast

library(tidyverse)

temp <- trapID.df %>%
          left_join(site.use.df) %>%
          mutate_at(vars(first, last), mdy) %>%
          mutate(date = map2(first, last, seq, by = "1 day")) %>%
          unnest(date) %>%
          select(-first, -last) %>%
          mutate(present = 1) %>%
          group_by(trapID, site) %>%
          complete(date = seq(min(date), max(date), by = "1 day"), 
                          fill = list(present = 0)) %>%
          pivot_wider(names_from = date, values_from = present, 
                      values_fill = list(present = 0))


#If you need data sorted by date
temp[c(names(temp)[1:2], sort(names(temp)[-(1:2)]))] 


#   trapID site  `2017-01-07` `2017-01-08` `2017-01-09` `2017-01-10` `2017-01-11`
#    <int> <fct>        <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
# 1      1 B1               0            0            0            0            1
# 2      2 B1               0            0            0            0            1
# 3      3 B1               0            0            0            0            1
# 4      4 B1               0            0            0            0            1
# 5      5 B1               0            0            0            0            1
# 6    154 P1               1            1            0            0            0
# 7    155 P1               1            1            0            0            0
# 8    156 P1               1            1            0            0            0
# 9    157 P1               1            1            0            0            0
#10    158 P1               1            1            0            0            0
#11    304 R1               0            0            0            1            1
#12    305 R1               0            0            0            1            1
#13    306 R1               0            0            0            1            1
#14    307 R1               0            0            0            1            1
#15    308 R1               0            0            0            1            1
# … with 5 more variables: `2017-01-12` <dbl>, `2017-01-13` <dbl>, 
#   `2017-01-14` <dbl>, `2017-01-15` <dbl>, `2017-01-16` <dbl>

推荐阅读