我无法根据不同列中的不同属性对数据进行子集化。这是一个虚拟数据集,包含物种,找到它的区域和时间(已经在POSIXct中)。
SP Time Area
B 07:22 1
F 09:22 4
A 09:22 1
C 08:17 3
D 09:20 1
E 06:55 4
D 09:03 1
E 09:12 2
F 09:45 1
B 09:15 1
我需要对具有SP == A的行以及在同一区域(在本例中为1)中出现的所有其他物种进行子集化,在+30和-30分钟的时间窗口内返回:
SP Time Area
A 09:22 1
D 09:20 1
D 09:03 1
F 09:45 1
B 09:15 1
我无法通过这个1小时窗口的条件语句,我应该在这里使用for循环,还是有更简单的方法对其进行分组? 非常感谢提前。
答案 0 :(得分:2)
使用一个A
值重新生成您的初始结果,假设您的数据被称为dat
,可以这样做:
with(dat,dat[
(
SP=="A" |
Area==Area[SP=="A"]
) &
abs(difftime(Time,Time[SP=="A"],units="mins")) <= 30,
]
)
结果:
SP Time Area
3 A 2013-09-09 09:22:00 1
5 D 2013-09-09 09:20:00 1
7 D 2013-09-09 09:03:00 1
9 F 2013-09-09 09:45:00 1
10 B 2013-09-09 09:15:00 1
要考虑A
的多次出现,事情会变得更加复杂:
with(dat,dat[
(
SP=="A" |
Area %in% Area[SP=="A"]
) &
apply(
sapply(Time[SP=="A"],
function(x) abs(difftime(Time,x,units="mins"))<=30 ),1,any
)
,]
)
虽然我确信在某处可能会有简化。