R 创建一个检测器使用情况表,其中包含列的场合
我需要创建一个检测器使用表,其中行是单个检测器,列是它们都处于活动状态的完整日期范围。在该表中,1表示探测器在给定日期处于活动状态,0表示探测器处于非活动状态。圈闭在“部位”(如部位:A1、B1、C1)划定的组中被激活。列中的连续日期范围需要从第一个陷阱激活的第一天开始,到最后一个陷阱激活的最后一天结束 目前,我有以下数据表要处理 场地使用表:R 创建一个检测器使用情况表,其中包含列的场合,r,rmark,R,Rmark,我需要创建一个检测器使用表,其中行是单个检测器,列是它们都处于活动状态的完整日期范围。在该表中,1表示探测器在给定日期处于活动状态,0表示探测器处于非活动状态。圈闭在“部位”(如部位:A1、B1、C1)划定的组中被激活。列中的连续日期范围需要从第一个陷阱激活的第一天开始,到最后一个陷阱激活的最后一天结束 目前,我有以下数据表要处理 场地使用表: > site.use.df site first last 1: B1 1/11/2017 1/12/2017 2
> 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
如果我理解正确,使用
tidyverse
我们可以在first
和last
列之间创建一个日期序列,并以宽格式获取数据,创建1/0列
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>
库(tidyverse)
温度%
左联合(site.use.df)%>%
在(变量(第一个,最后一个),mdy)%>
突变(日期=map2(第一个、最后一个、顺序,按=“1天”))%>%
unnest(日期)%%>%
选择(-first,-last)%%>%
突变(存在=1)%>%
分组依据(trapID,站点)%>%
完成(日期=序号(最短(日期),最长(日期),截止日期=“1天”),
填充=列表(当前=0))%>%
透视图(名称从=日期,值从=当前,
值\填充=列表(当前=0))
#如果需要按日期排序的数据
温度[c(名称(温度)[1:2],排序(名称(温度)[-(1:2)])]
#trapID站点`2017-01-07``2017-01-08``2017-01-09``2017-01-10``2017-01-11`
#
#1 B1 0 0 0 1
#2 B1 0 0 0 1
#3 3 B1 0 0 0 1
#4 4 B1 0 0 0 1
#5 B1 0 0 0 1
#6154 P1 110 0 0 0
#7155 P1 10100
#8156 P1 10100
#9157 P1 10100
#10158 P1 10100
#11304 r1001
#12305R1 0 0 1 1
#13 306 R1 0 0 1 1
#14307 R1 0 0 1 1
#15308 R1 0 0 1 1
#…还有5个变量:`2017-01-12`、`2017-01-13`,
# `2017-01-14` , `2017-01-15` , `2017-01-16`
如果我理解正确,使用tidyverse
我们可以在first
和last
列之间创建一个日期序列,并以宽格式获取数据,创建1/0列
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>
库(tidyverse)
温度%
左联合(site.use.df)%>%
在(变量(第一个,最后一个),mdy)%>
突变(日期=map2(第一个、最后一个、顺序,按=“1天”))%>%
unnest(日期)%%>%
选择(-first,-last)%%>%
突变(存在=1)%>%
分组依据(trapID,站点)%>%
完成(日期=序号(最短(日期),最长(日期),截止日期=“1天”),
填充=列表(当前=0))%>%
透视图(名称从=日期,值从=当前,
值\填充=列表(当前=0))
#如果需要按日期排序的数据
温度[c(名称(温度)[1:2],排序(名称(温度)[-(1:2)])]
#trapID站点`2017-01-07``2017-01-08``2017-01-09``2017-01-10``2017-01-11`
#
#1 B1 0 0 0 1
#2 B1 0 0 0 1
#3 3 B1 0 0 0 1
#4 4 B1 0 0 0 1
#5 B1 0 0 0 1
#6154 P1 110 0 0 0
#7155 P1 10100
#8156 P1 10100
#9157 P1 10100
#10158 P1 10100
#11304 r1001
#12305R1 0 0 1 1
#13 306 R1 0 0 1 1
#14307 R1 0 0 1 1
#15308 R1 0 0 1 1
#…还有5个变量:`2017-01-12`、`2017-01-13`,
# `2017-01-14` , `2017-01-15` , `2017-01-16`
你能清楚你的问题是什么吗?另外,你能给我们提供样品数据和你想要的输出吗?对不起,我已经编辑了它,让它更清楚。你能清楚你的问题是什么吗?另外,你能给我们提供样本数据和你想要的输出吗?对不起,我已经编辑了它以使其更清晰。谢谢Ronak,我已经编辑了问题/数据示例以使其更有意义。你的答案几乎就在那里,然而,我要找的是陷阱活动表,而不是站点活动表