子集相邻字段

时间:2013-09-09 20:08:17

标签: r subset intervals sapply

我正在尝试进行条件子集化,其中包括邻近区域窗口内的当代元素。 例如,给定矩阵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将在不同区域的数据集中重复出现的假设。 我有一个尝试,由用户提供来自我之前发布的不同问题(带有相关元素)的邮件,只需稍加修改。添加了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。如果需要,我可以删除其中一个链接。

1 个答案:

答案 0 :(得分:1)

假设邻近区域由给定区域的+/- 1区域定义:

复制上一个问题:Subsetting based on co-occurrence within a time window ...

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),]

关于Conditional subsetting by POSIXct interval and another field containing interval移除SP的条件==&#39; A&#39;应该导致正确的子集

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,]