Найти первое вхождение значения только после другого значения, используя dplyr - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы найти первую строку значения, но только когда это происходит после другого значения.У меня есть набор данных временных рядов использования ящика с птичьим гнездом, и для каждого ящика я хотел бы отфильтровать строку, когда ящик впервые освобождается после того, как был занят.Вот упрощенный пример данных:

# A tibble: 20 x 3
   NestID Date       Status  
   <chr>  <date>     <chr>   
 1 WA18   2019-02-01 Empty   
 2 WA18   2019-02-02 Empty   
 3 WA18   2019-02-03 Empty   
 4 WA18   2019-02-04 Occupied
 5 WA18   2019-02-05 Occupied
 6 WA18   2019-02-06 Occupied
 7 WA18   2019-02-07 Empty   
 8 WA18   2019-02-08 Empty 

dat <- structure(list(NestID = c("WA18", "WA18", "WA18", "WA18", "WA18", 
    "WA18", "WA18", "WA18", "WA18", "WA20", "WA20", "WA20", "WA20", 
    "WA20", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20"), Date = structure(c(17928, 
    17929, 17930, 17931, 17932, 17933, 17934, 17935, 17936, 17555, 
    17556, 17557, 17558, 17559, 17560, 17561, 17562, 17563, 17564, 
    17565), class = "Date"), Status = c("Empty", "Empty", "Empty", 
    "Occupied", "Occupied", "Occupied", "Empty", "Empty", "Empty", 
    "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Occupied", 
    "Occupied", "Empty", "Empty", "Empty")), class = c("tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -20L))

Итак, для гнезда WA18 я хочу отфильтровать строку, где дата 2019-02-07 (поле сначала считается пустым после заполнения).Не совсем уверен, что лучше всего индексировать эту строку, но я бы хотел использовать для этого dplyr.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

С data.table:

library(data.table)

setDT(dat)[, .SD[Status == "Empty" & shift(Status) == "Occupied"], by = NestID]

Выход:

   NestID       Date Status
1:   WA18 2019-02-07  Empty
2:   WA20 2018-02-01  Empty
0 голосов
/ 27 февраля 2019

Вы можете использовать lag, чтобы получить значение предыдущей строки:

dat %>%
  group_by(NestID) %>%
  filter(Status == "Empty" &
           lag(Status) == "Occupied")


#    NestID Date       Status
#    <chr>  <date>     <chr> 
#  1 WA18   2019-02-07 Empty 
#  2 WA20   2018-02-01 Empty 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...