【问题标题】:Aggregate date time to summarize time spent at certain conditions汇总日期时间以汇总在某些条件下花费的时间
【发布时间】:2019-03-20 19:03:24
【问题描述】:

我不知道该怎么做。我在下面有一些虚拟数据:

 Date <- as.POSIXct(c('2018-03-20 11:52:25', '2018-03-22 12:01:44', '2018-03-20 12:05:25', '2018-03-20 12:10:40', '2018-03-20 12:12:51 ')) 
Sites<-c(4, 4, 4, 6, 7)
Individual<-c("A", "A", "A", "B", "B")

data.frame(Individual, Date, Sites)

产生这个数据框:

  Individual                Date Sites
          A 2018-03-20 11:52:25     4
          A 2018-03-20 12:01:44     4
          A 2018-03-20 12:05:25     4
          B 2018-03-20 12:10:40     6
          B 2018-03-20 12:12:51     7

对于每个人,我想确定在每个站点花费的时间。是否有一个函数可以根据这两个条件汇总所花费的时间?非常感谢任何帮助或输入。

【问题讨论】:

  • 在这种情况下,您只有足够的信息来说明 B 在站点 6 停留了多长时间,对吗? (我的意思是,对于另外两个单独的站点法术,你看不到它们何时结束。)
  • 是的,你是对的!我应该包括每个人的开始/结束日期,而不是只包括一个时间点。

标签: r datetime summary


【解决方案1】:

这个怎么样:

library(tidyverse)

Date <- as.POSIXct(c('2018-03-20 11:52:25', '2018-03-22 12:01:44', '2018-03-20 12:05:25', '2018-03-20 12:10:40', '2018-03-20 12:12:51 ')) 
Sites <- c(4, 4, 4, 6, 7)
Individual <- c("A", "A", "A", "B", "B")

df <- data.frame(Individual, Date, Sites)

df %>%
  group_by(Individual, Sites) %>%
  summarise(time_spent = max(Date) - min(Date))
#> # A tibble: 3 x 3
#> # Groups:   Individual [2]
#>   Individual Sites time_spent  
#>   <fct>      <dbl> <time>      
#> 1 A              4 2.00647 days
#> 2 B              6 0.00000 days
#> 3 B              7 0.00000 days

reprex package (v0.2.1) 于 2019-03-20 创建

【讨论】:

  • 这正是我想要的!谢谢!
【解决方案2】:

我愿意……

library(data.table)
setDT(DF)

spellDT = DF[, .(StartDate = first(Date)), by=.(Individual, Site = Sites, g = rleid(Sites))]
spellDT[, duration := shift(StartDate, type="lead") - StartDate, by=Individual][]

   Individual Site g           StartDate      duration
1:          A    4 1 2018-03-20 11:52:25       NA mins
2:          B    6 2 2018-03-20 12:10:40 2.183333 mins
3:          B    7 3 2018-03-20 12:12:51       NA mins

或在 dplyr 动词中类似:

library(dplyr)

DF %>% distinct(Individual, g = data.table::rleid(Sites), .keep_all = TRUE) %>% 
  rename(StartDate = Date, Site = Sites) %>%
  group_by(Individual) %>% mutate(duration = lead(StartDate) - StartDate)

# A tibble: 3 x 5
# Groups:   Individual [2]
  Individual StartDate            Site     g duration     
  <fct>      <dttm>              <dbl> <int> <time>       
1 A          2018-03-20 11:52:25     4     1       NA mins
2 B          2018-03-20 12:10:40     6     2 2.183333 mins
3 B          2018-03-20 12:12:51     7     3       NA mins

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多