【问题标题】:Subsetting based on co-occurrence within a time window基于时间窗口内共现的子集
【发布时间】:2013-09-12 10:35:23
【问题描述】:

我无法根据不同列中的不同属性对数据进行子集化。这是一个包含物种、发现区域和时间的虚拟数据集(已经在 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

我需要在 +30 分钟和 -30 分钟的时间窗口内对具有 SP==A 的行以及同一区域中出现的所有其他物种(在本例中为 1)进行子集化处理:

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 循环,还是有更简单的子集方法? 非常感谢。

【问题讨论】:

  • 我们感谢带有可重复示例的明确陈述的问题,+1。在此示例之外,是否会出现多个A 的情况,以及多组条件(包括AreasTime 窗口时)?
  • 是的,物种 A 会在整个数据集中重复出现。因此,输出将包括其他时间窗口和其他区域。
  • 请告诉我们你到目前为止做了什么。

标签: r subset posixct


【解决方案1】:

假设您的数据名为dat,只使用一个A 值复制您的初始结果,可以这样做:

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

虽然我确信这里的某个地方可能会进行简化。

【讨论】:

  • 此代码适用于选择 1 小时时间窗口内的共现,但输出给出了不同区域的共现。尽管如此,时间窗口的解决方案还是相当优雅的,并且已经清除了最大的障碍。我将努力清除区域共现。
猜你喜欢
  • 1970-01-01
  • 2021-02-28
  • 2021-12-31
  • 2019-02-09
  • 1970-01-01
  • 2022-08-16
  • 2015-03-26
  • 1970-01-01
  • 2018-03-24
相关资源
最近更新 更多