POSIXct间隔的条件子集和包含间隔的另一个字段

时间:2013-09-10 18:17:02

标签: r subset apply posixct

给定数据集Dat,其中我有物种(SP),区域(AR)和时间(TM)(在POSIXct中)。 我希望在记录之前和之后的半小时内,以及在同一区域内(包括两个相邻区域(+和 - 1))对物种A中存在的个体的数据进行子集化。例如,如果物种A出现在4区的1点,我希望在3,4和5区的同一天从12:30到1:30对所有物种进行分组。例如:

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 ,他们提供了有用的答案。 Subsetting based on co-occurrence within a time window Subsetting neighboring fileds 反馈是:

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

1 个答案:

答案 0 :(得分:1)

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

使用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