代码之家  ›  专栏  ›  技术社区  ›  bumblebee

R:数据。表:使用随时间变化的引用进行聚合

  •  1
  • bumblebee  · 技术社区  · 7 年前

    我有一个带有句点的数据集

    active <- data.table(id=c(1,1,2,3), beg=as.POSIXct(c("2018-01-01 01:10:00","2018-01-01 01:50:00","2018-01-01 01:50:00","2018-01-01 01:50:00")), end=as.POSIXct(c("2018-01-01 01:20:00","2018-01-01 02:00:00","2018-01-01 02:00:00","2018-01-01 02:00:00")))
    > active
       id                 beg                 end 
    1:  1 2018-01-01 01:10:00 2018-01-01 01:20:00 
    2:  1 2018-01-01 01:50:00 2018-01-01 02:00:00    
    3:  2 2018-01-01 01:50:00 2018-01-01 02:00:00    
    4:  3 2018-01-01 01:50:00 2018-01-01 02:00:00    
    

    在此期间,id处于活动状态。我想向大家介绍一下 ids 并确定每一点

    time <- data.table(seq(from=min(active$beg),to=max(active$end),by="mins"))
    

    处于非活动状态的ID数以及它们变为活动状态前的平均分钟数。也就是说,理想情况下,桌子看起来像

    >ans
                       time  inactive av.time
     1: 2018-01-01 01:10:00         2      30
     2: 2018-01-01 01:11:00         2      29
    ...
    50: 2018-01-01 02:00:00         0       0
    

    我相信这可以通过使用 data.table 但我无法理解得到时差的语法。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jordo82    7 年前

    使用 dplyr ,我们可以通过一个虚拟变量连接,来创建 time active .定义 inactive av.time 可能不是你想要的,但它应该让你开始。如果你的数据非常大,我同意 data.table 将是更好的处理方式。

    library(tidyverse)
    
    time %>% 
      mutate(dummy = TRUE) %>% 
      inner_join({
        active %>% 
          mutate(dummy = TRUE)
        #join by the dummy variable to get the Cartesian product
      }, by = c("dummy" = "dummy")) %>% 
      select(-dummy) %>% 
      #define what makes an id inactive and the time until it becomes active
      mutate(inactive = time < beg | time > end,
             TimeUntilActive = ifelse(beg > time, difftime(beg, time, units = "mins"), NA)) %>% 
      #group by time and summarise
      group_by(time) %>% 
      summarise(inactive = sum(inactive),
                av.time = mean(TimeUntilActive, na.rm = TRUE))
    
    # A tibble: 51 x 3
            time            inactive av.time
            <dttm>            <int>   <dbl>
    1 2018-01-01 01:10:00        3      40
    2 2018-01-01 01:11:00        3      39
    3 2018-01-01 01:12:00        3      38
    4 2018-01-01 01:13:00        3      37
    5 2018-01-01 01:14:00        3      36
    6 2018-01-01 01:15:00        3      35
    7 2018-01-01 01:16:00        3      34
    8 2018-01-01 01:17:00        3      33
    9 2018-01-01 01:18:00        3      32
    10 2018-01-01 01:19:00        3      31