【问题标题】:Using lead with dplyr to compute the difference between two time stamps使用铅与 dplyr 计算两个时间戳之间的差异
【发布时间】:2019-05-01 23:36:51
【问题描述】:

我想根据条件“开始”在一个列中找到时间戳,然后在同一列中找到满足另一个条件的第一行的时间戳,从而找到两个时间戳之间的差异, “停止”。基本上我们使用一个程序来“开始”一个行为并“停止”一个行为,这样我们就可以计算行为的持续时间。

我已经尝试修改这篇文章中的代码:subtract value from previous row by group

但我不知道如何让潜在客户满足同一列即将到来的行中的条件。由于可能存在具有“开始”但没有“停止”的“事件”行为,这一事实使情况变得复杂。示例数据框。

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)

但我不能正确使用潜在客户,因为这只会在 diff 列中为我返回 Time_Relative_s。有什么建议么?感谢您的帮助!

【问题讨论】:

  • 能否请您提供您的日期范围或一些reproducible example
  • 示例数据由以下@akrun 友情提供。除了我在上面尝试过的代码之外,我真的没有可重现的错误示例(但只是没有返回任何内容。我想我希望从人们那里得到一些建议(使用 lag/铅或其他任何东西)。

标签: r dplyr lead


【解决方案1】:

我们可能需要根据'stop'的出现创建一个分组变量,然后得到'Modifier_1'中第一个'Start'、'Stop'值的位置对应的'Time_relative_s'的差

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")

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2014-05-04
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多