gpt4 book ai didi

r - 按组选择事件第一次发生之前的行

转载 作者:行者123 更新时间:2023-12-04 12:30:58 28 4
gpt4 key购买 nike

我有一系列观察来描述是否以及何时在特定区域发现了动物。下面的示例表标识了每天何时看到某种动物 ( 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 )来回答这个问题,我总是喜欢新的东西。感谢您的时间!

最佳答案

请尝试以下操作:

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 )也会快得多。见 this post有关更多信息。

关于r - 按组选择事件第一次发生之前的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com