0

我正在尝试制作一个条件子集,其中包括邻近区域窗口内的当代元素。例如,给定矩阵 Dat,其中 Species (SP)、Area (AR) 和 Time (TM):

SP AR TM
A  2  2
B  2  2
C  1  4
F  3  2
B  5  3
E  3  2
D  2  1
I  1  4
H  3  2
E  2  4
D  3  5
B  1  2

如何同时检索与物种 A 共生的所有物种,但在相邻区域内(在本例中为 1 和 3)?所需的输出是:

SP  AR  TM
A  2  2
B  2  2
F  3  2
H  3  2
B  1  2

这是基于物种 A 将在不同区域的数据集中重复出现的假设。我有一个尝试,由用户 thelatemail 从我之前发布的另一个问题(带有相关元素)给出,稍作修改。添加的 X 表示我无法弄清楚的语法部分,这基本上是括号的定义(考虑到它或多或少应该去的地方)。

with(dat,dat[
  apply(
    sapply(TM[SP=="A"],
    function(x) abs(AR)XXXXX),1,any
  )
,]
)

任何帮助深表感谢。

这是我试图对大型数据集进行的一组操作的一部分。我将问题分成两个元素,它们有些相关但远非重复。原因是我是 R 初学者,想学习如何自己解释、编写和集成代码。相关问题的链接:Subsetting based on co-occurrence within a time window。如果需要,我可以删除其中一个链接。

4

1 回答 1

1

假设相邻区域由给定区域 +/- 1 范围内的区域定义:

复制上一个问题:基于时间窗口内共现的子集...

with(dat,dat[
  (
    SP=="A" |
    # Area %in% Area[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
  ) 
,]
)

根据评论(和我的评论)

area <- 2
dat[dat$AR %in% c(area - 1, area, area + 1),]

并且关于POSIXct 间隔的条件子集和另一个包含间隔的字段删除 SP=='A' 的条件应该导致正确的子集

area_boolean <- with(dat, Area %in% c(Area[SP=='A']-1, Area[SP=='A'], Area[SP=='A']+1))
time_boolean <- with(dat, apply(sapply(Time[SP=="A"],
                                function(x) abs(difftime(Time, x, units="mins")) <= 30 ),  
                                1, 
                                any))
dat[area_boolean & time_boolean,]
于 2013-09-09T20:18:45.193 回答