2014-06-26 54 views
2

我有一系列觀察描述動物是否以及何時在特定區域發現。以下樣本表標識了白天何時看到某隻動物(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)來回答這個問題,我始終保持對新事物。感謝您的時間!

回答

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)也將快得多。有關更多信息,請參閱this post

+0

謝謝您的解決方案和參考。這非常有幫助! – 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

+0

@AndrewMacDonald,您的解決方案非常有用,因爲它可以識別動物消失前的所有天,而不僅僅是第一個事件。再次感謝你! – ccapizzano

相關問題