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