仅按动物ID在另一张表中的日期范围内选择日期

时间:2017-11-30 21:46:42

标签: loops date if-statement join date-range

我有两张数据表,一张包含30分钟间隔的鸟类运动数据,另一张包含鸟类筑巢的日期范围。我只对查看嵌套范围内的运动数据感兴趣(仅使用短日期)。这是一个简化的数据示例(我有数千行IRL):

Data frame 1:
Bird_ID     Date        
A           4/5/2015 
A           4/20/2015
A           4/28/2015
B           5/6/2016
B           5/30/2016
C           3/4/2014
C           3/9/2014

Data frame 2:
Bird_ID     Nest_start     Nest_end
A           4/2/2015       4/15/2015
B           5/21/2016      6/3/2016
C           4/1/2014       4/15/2014

我正在寻找这样的输出:

Data frame 1.1:
Bird_ID     Date        Keep (0=no, 1=yes)?  
A           4/5/2015    1
A           4/20/2015   0
A           4/28/2015   0
B           5/6/2016    0
B           5/30/2016   1
C           3/4/2014    0
C           3/9/2014    0

列的长度不同。我在其他帖子的方法后遇到了错误(但如果这是重复的话,很抱歉!)。提前谢谢!

1 个答案:

答案 0 :(得分:1)

首先创建数据,在导入表格时,向stringAsFactors=Fread.table添加参数read.csv非常重要。这可以确保R不会将您的日期视为一个因素。

df1 <- data.frame(Bird_ID = c(rep("A", 3), rep(c("B", "C"), each = 2)),
                  Date = c("4/5/2015", "4/20/2015", "4/28/2015",
                           "5/6/2016", "5/30/2016", "3/4/2014", "3/9/2014"),
                  stringsAsFactors = F)
df2 <- data.frame(Bird_ID = c("A", "B", "C"),
                  Nest_start = c("4/2/2015", "5/21/2016", "4/1/2014"),
                  Nest_end = c("4/15/2015", "6/3/2016", "4/15/2014"),
                  stringsAsFactors = F)

将日期设为日期对象

df1$Date <- as.Date(df1$Date, format = "%m/%d/%Y")
df2$Nest_start <- as.Date(df2$Nest_start, format = "%m/%d/%Y")
df2$Nest_end <- as.Date(df2$Nest_end, format = "%m/%d/%Y")

使用left_join包中的dplyr将两个表合并为一个,因为您的两个表具有相同的列名列,不需要其他参数。

library(dplyr)
df <- df1 %>%
  left_join(df2)

将日期正确声明为日期对象后,R允许您执行逻辑运算符,以便创建“保留”列。在这里,我将列设为TRUE / FALSE,但您可以通过as.numeric(df$Keep)将其转换为数字(1/0)。

df$Keep <- df$Date <= df$Nest_end & df$Date >= df$Nest_start
df