cca*_*ano 2 aggregate r data.table
我有一系列的观察结果描述了动物是否以及何时被发现在特定区域.以下样本表确定每天看到某种动物(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
Run Code Online (Sandbox Code Playgroud)
使用该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
Run Code Online (Sandbox Code Playgroud)
虽然上表很有用,但我想知道如何操作该函数以在第一次出现动物缺席之前找到日期.换句话说,我想知道每只动物在临时离开前的最后一天.
我的实际数据集根据情况将这些存在/不存在观察结果分成不同的时间长度(例如,每隔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
Run Code Online (Sandbox Code Playgroud)
请随意使用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
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这种方法(.I代替使用.SD)也会快得多.有关更多信息,请参阅此帖子.
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |