2

给定一个数据集 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 蚂蚁任何给定时间。在之前的一组帖子中,我将这个问题一分为二,这样我就可以学习如何集成代码,但我对问题的规范存在缺陷。非常感谢提供有用答案的用户ThelatemailJason 。基于时间窗口内共现的子集 对 相邻字段进行子集 反馈是:

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 问题和使用子集命令引起的,因为时间窗口中包含不同的时间。是否需要另一个应用函数来分隔该区域间隔?任何帮助深表感谢

4

1 回答 1

1

一个可能的解决方案非常受@thelatemail@Justin以前的好答案的启发,但这说明了空间布尔表达式中的时间(请参阅我对这个问题的评论)。

使用sapply,我们在物种 A ( time[SP == "A"]) 的每次注册时间上“循环”,并创建一个布尔矩阵mm,每个 A 注册有一列。每一行代表针对给定 A 注册的每个注册的空间和时间测试。

mm <- with(dat,
           sapply(time[SP == "A"], function(x)
             abs(AR - AR[SP == "A" & time == x]) <= 1 &
                    abs(difftime(time, x, units = "mins")) <= 30))

# select rows from data where at least one column in mm is TRUE    
dat[rowSums(mm) > 0, ]

# SP                time AR
# 3   A 2003-01-01 09:22:00  1
# 5   D 2003-01-01 09:20:00  1
# 7   D 2003-01-01 09:03:00  1
# 8   E 2003-01-01 09:12:00  2
# 9   F 2003-01-01 09:45:00  1
# 11  A 2003-01-03 10:30:00  5
# 13  F 2003-01-03 10:20:00  6
# 14  D 2003-01-03 10:05:00  4
于 2013-09-10T23:13:59.123 回答