按组选择事件前的第一次出现的行

3

我有一系列的观察记录,描述了动物在特定区域被发现的时间和情况。下面这个示例表格标识了某种动物在每天是否被看到(status == 1表示看到,status == 0表示未看到)。

   id       date status
1   1 2014-06-20      1
2   1 2014-06-21      1
3   1 2014-06-22      1
4   1 2014-06-23      1
5   1 2014-06-24      0
6   2 2014-06-20      1
7   2 2014-06-21      1
8   2 2014-06-22      0
9   2 2014-06-23      1
10  2 2014-06-24      1
11  3 2014-06-20      1
12  3 2014-06-21      1
13  3 2014-06-22      0
14  3 2014-06-23      1
15  3 2014-06-24      0
16  4 2014-06-20      1
17  4 2014-06-21      0
18  4 2014-06-22      0
19  4 2014-06-23      0
20  4 2014-06-24      1

使用 data.table 包,我可以确定动物在该地区不再出现的第一天:
library(data.table)
dt <- as.data.table(df)
dt[status == 0, .SD[1], by = id]
  id       date status
1:  1 2014-06-24      0
2:  2 2014-06-22      0
3:  3 2014-06-22      0
4:  4 2014-06-21      0

虽然上面的表格很有用,但我想知道如何操作函数以找到动物缺席首次出现之前的日期。换句话说,我想知道每只动物在暂时离开之前最后一天在该区域的时间。我的实际数据集将这些存在/缺失观测分为不同的时间长度,具体取决于情况(例如,每3小时、6小时存在/缺失)。因此,访问上一行而不是从每个值中减去时间间隔会更容易,因为它总是在变化。我的期望输出如下:
  id       date status
1:  1 2014-06-23      1
2:  2 2014-06-21      1
3:  3 2014-06-21      1
4:  4 2014-06-20      1

请随意使用base代码或其他包(例如dplyr)来回答这个问题,我总是喜欢尝试新东西。感谢您抽出时间!
2个回答

9

请尝试以下方法:

dt[dt[status == 0, .I[1] - 1, by = id]$V1]
#   id       date status
#1:  1 2014-06-23      1
#2:  2 2014-06-21      1
#3:  3 2014-06-21      1
#4:  4 2014-06-20      1

顺便提一下,使用.I而不是.SD的方法速度也会更快。有关更多信息,请参见此帖子


谢谢您提供的解决方案和参考。这对我帮助很大! - ccapizzano

4

这里有一种使用 dplyr 的方法:

df %>% 
  group_by(id) %>%
  mutate(status_change = status - lead(status)) %>%
  filter(status_change == 1)
  id       date status status_change
1  1 2014-06-23      1             1
2  2 2014-06-21      1             1
3  3 2014-06-21      1             1
4  3 2014-06-23      1             1
5  4 2014-06-20      1             1

这利用了status是数字变量的优势。lead()访问下一个值;当动物消失时,更改为1。

1
我以前没见过 lead 的使用,非常方便。为了避免向数据集添加新列,你可以在 filter 中进行计算:filter(status - lead(status) == 1) - aosmith
@AndrewMacDonald,您的解决方案非常有帮助,因为它识别了动物消失之前的所有天数,而不仅仅是第一次事件。再次感谢! - ccapizzano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接