Использование свинца с dplyr для вычисления разницы между двумя временными метками - PullRequest
1 голос
/ 02 мая 2019

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

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

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

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.Какие-либо предложения?Спасибо за помощь!

1 Ответ

2 голосов
/ 02 мая 2019

Нам может понадобиться создать группирующую переменную, основанную на вхождении «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")
...