我有两张数据表,一张包含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
列的长度不同。我在其他帖子的方法后遇到了错误(但如果这是重复的话,很抱歉!)。提前谢谢!
答案 0 :(得分:1)
首先创建数据,在导入表格时,向stringAsFactors=F
或read.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