给定一个数据集 Dat,其中我有物种 (SP)、面积 (AR) 和时间 (TM)(在 POSIXct 中)。我想在记录前后半小时内以及同一区域内(包括两个相邻区域(+ 和 - 1))对与物种 A 存在的个体的数据进行子集化。例如,如果物种 A 在区域 4 的 1:00 出现,我希望将同一天从 12:30 到 1:30 出现在区域 3,4 和 5 的所有物种进行子集化。例如:
SP TM AR
B 1-jan-03 07:22 1
F 1-jan-03 09:22 4
A 1-jan-03 09:22 1
C 1-jan-03 08:17 3
D 1-jan-03 09:20 1
E 1-jan-03 06:55 4
D 1-jan-03 09:03 1
E 1-jan-03 09:12 2
F 1-jan-03 09:45 1
B 3-jan-03 09:15 1
A 3-jan-03 10:30 5
F 3-jan-03 07:30 5
F 3-jan-03 10:20 6
D 3-jan-03 10:05 4
这个虚拟表的期望结果是:
SP TM AR
A 1-jan-03 09:22 1
D 1-jan-03 09:20 1
D 1-jan-03 09:03 1
E 1-jan-03 09:12 2
F 1-jan-03 09:45 1
A 3-jan-03 10:30 5
F 3-jan-03 10:20 6
D 3-jan-03 10:05 4
注意:物种 A 在任何给定区域的任何给定区域内重复出现在整个数据集中,范围从 1-81 蚂蚁任何给定时间。在之前的一组帖子中,我将这个问题一分为二,这样我就可以学习如何集成代码,但我对问题的规范存在缺陷。非常感谢提供有用答案的用户Thelatemail和Jason 。基于时间窗口内共现的子集 对 相邻字段进行子集 反馈是:
with(dat,dat[
(
SP=="A" |
Area %in% c(Area[SP=='A']-1, Area[SP=='A'], Area[SP=='A']+1)
) &
apply(
sapply(Time[SP=="A"],
function(x) abs(difftime(Time,x,units="mins"))<=30 ),1,any
)
,]
)
但是,它部分起作用,它仅在时间窗口内进行子集,而不是按区域。我认为这是由 POSIXct 问题和使用子集命令引起的,因为时间窗口中包含不同的时间。是否需要另一个应用函数来分隔该区域间隔?任何帮助深表感谢