Использование Lead с dplyr для вычисления разницы между двумя отметками времени

Я хочу найти разницу между двумя отметками времени на основе поиска отметки времени в одном столбце на основе условия «Начало», а затем нахождения отметки времени для первой строки, которая соответствует другому условию в том же столбце «Стоп» . В основном мы использовали программу для «запуска» поведения и «остановки» поведения, чтобы мы могли рассчитать продолжительность поведения.

Я попытался адаптировать код из этого сообщения: вычесть значение из предыдущей строки на группа

но я не могу понять, как заставить работать над выполнением условия в следующих строках для того же столбца. Это осложняется тем фактом, что могут быть «событийные» поведения, у которых есть «начало», но нет «остановки». Пример фрейма данных.

Data
Behavior             Modifier_1           Time_relative_s              
BodyLength           Start                122.11      
Growl                Start                129.70
Body Length          Stop                 132.26      
Body Length          Start                157.79      
Body Length          Stop                 258.85      
Body Length          Start                270.12    
Bark                 Start                272.26
Growl                Start                275.68
Body Length          Stop                 295.37

и я хочу это:

Behavior             Modifier_1           Time_relative_s       diff             
BodyLength           Start                122.11                10.15
Growl                Start                129.70                 
Body Length          Stop                 132.26                
Body Length          Start                157.79                101.06  
Body Length          Stop                 258.85      
Body Length          Start                270.12                25.25    
Bark                 Start                272.26
Growl                Start                275.68
Body Length          Stop                 295.37

Я пробовал использовать трубы dplyr:

test<-u%>%
    filter(Modifier_1 %in% c("Start","Stop")) %>%
    arrange(Time_Relative_s) %>%
    mutate(diff = lead(Time_Relative_s, default = first(Time_Relative_s=="Stop")-Time-Relative_s)

Но я не должен правильно использовать свинец, потому что он просто возвращает мне Time_Relative_s в столбце diff. Какие-либо предложения? Спасибо за помощь!


person Meghan Martin    schedule 01.05.2019    source источник
comment
Не могли бы вы предоставить рамку даты или какой-нибудь воспроизводимый пример?   -  person bbiasi    schedule 02.05.2019
comment
Данные примера были любезно предоставлены @akrun ниже. У меня действительно нет воспроизводимого примера того, что что-то идет не так, кроме кода, который я поместил выше, о том, что я пробовал (но просто ничего не возвращает. Думаю, я надеялся получить некоторые предложения от людей (используя lag / свинец или что-нибудь еще).   -  person Meghan Martin    schedule 02.05.2019


Ответы (1)


Нам может потребоваться создать группирующую переменную на основе появления 'stop', а затем получить разницу 'Time_relative_s', которая соответствует местоположению первых значений 'Start', 'Stop' в 'Modifier_1'

library(dplyr)
df1 %>% 
   group_by(grp = cumsum(lag(Modifier_1 == "Stop", default = FALSE))) %>% 
   mutate(diff = Time_relative_s[match("Stop", Modifier_1)] - 
                  Time_relative_s[match("Start", Modifier_1)], 
          diff = replace(diff, row_number() > 1, NA_real_)) %>%
   ungroup %>%
   select(-grp)
# A tibble: 9 x 4
#  Behavior    Modifier_1 Time_relative_s  diff
#  <chr>       <chr>                <dbl> <dbl>
#1 BodyLength  Start                 122.  10.1
#2 Growl       Start                 130.  NA  
#3 Body Length Stop                  132.  NA  
#4 Body Length Start                 158. 101. 
#5 Body Length Stop                  259.  NA  
#6 Body Length Start                 270.  25.2
#7 Bark        Start                 272.  NA  
#8 Growl       Start                 276.  NA  
#9 Body Length Stop                  295.  NA  

данные

df1 <- structure(list(Behavior = c("BodyLength", "Growl", "Body Length", 
"Body Length", "Body Length", "Body Length", "Bark", "Growl", 
"Body Length"), Modifier_1 = c("Start", "Start", "Stop", "Start", 
"Stop", "Start", "Start", "Start", "Stop"), Time_relative_s = c(122.11, 
129.7, 132.26, 157.79, 258.85, 270.12, 272.26, 275.68, 295.37
)), row.names = c(NA, -9L), class = "data.frame")
person akrun    schedule 02.05.2019