【问题标题】:R - Excluding repeating, chronological events in row countsR - 在行计数中排除重复的、按时间顺序排列的事件
【发布时间】:2022-01-28 09:23:52
【问题描述】:

我想计算具有时间元素的不同事件。当某个事件按时间顺序重复时,我只想把这个事件归功于一次。在该数据中,事件是移动性事件,因此假设被动移动性事件(对或错,不重要)是连续动作而不是不同的。这只会在特定的 event_date 中起作用,例如:

假设我有这个 df

df <- data.frame(id = c("1", "1", "1", "1", "2", "2", "2", "2"),
                 event = c("sitting", "sitting", "sitting", "sitting", "sitting", "walking", "sitting", "sitting"),
                 timestamp = c('2021-12-19 11:30:00', '2021-12-19 12:30:00', '2021-12-19 13:30:00', '2021-12-20 14:30:00', '2021-12-20 12:00:00', '2021-12-20 12:30:00', '2021-12-20 13:30:00', '2021-12-20 14:30:00'))

df$timestamp <- as.POSIXct(df$timestamp)
df$event_date <- as.Date(df$timestamp, format = "%Y-%m-%d")

> df
  id   event           timestamp event_date
1  1 sitting 2021-12-19 11:30:00 2021-12-19
2  1 sitting 2021-12-19 12:30:00 2021-12-19
3  1 sitting 2021-12-19 13:30:00 2021-12-19
4  1 sitting 2021-12-19 14:30:00 2021-12-19
5  2 sitting 2021-12-20 12:00:00 2021-12-20
6  2 walking 2021-12-20 12:30:00 2021-12-20
7  2 sitting 2021-12-20 13:30:00 2021-12-20
8  2 sitting 2021-12-20 14:30:00 2021-12-20

我想实现如下所示的输出:

> df
  id event_date mobility_events
1  1 2021-12-19               1
2  1 2021-12-20               1
3  2 2021-12-20               3

id 1 仅在第一个 event_date 获得 1 个移动性事件的功劳,因为它在该 event_date 处于同一活动的 3 个连续时间戳。 id 2 获得了 3 个事件的荣誉,因为坐着的事件被另一个事件打断了;但是,最后一次参加的活动并没有获得荣誉,因为它是按时间顺序排列的,并且不受其他活动的干扰。

我希望这很清楚。

【问题讨论】:

    标签: r timestamp


    【解决方案1】:

    您可以使用dplyr 简单地group_by 您的id 和日期,然后计算event != lag(event) 的次数。

    library(dplyr)
    
    df %>%
      group_by(id, event_date) %>%
      summarize(mobility_events = 1 + sum(event != lag(event), na.rm = T),
                .groups = "drop")
    #> # A tibble: 3 × 3
    #>   id    event_date mobility_events
    #>   <chr> <date>               <dbl>
    #> 1 1     2021-12-19               1
    #> 2 1     2021-12-20               1
    #> 3 2     2021-12-20               3
    

    【讨论】:

      【解决方案2】:

      数据

      df <- data.frame(id = c("1", "1", "1", "1", "2", "2", "2", "2"),
                       event = c("sitting", "sitting", "sitting", "sitting", "sitting", "walking", "sitting", "sitting"),
                       timestamp = c('2021-12-19 11:30:00', '2021-12-19 12:30:00', '2021-12-19 13:30:00', '2021-12-20 14:30:00', '2021-12-20 12:00:00', '2021-12-20 12:30:00', '2021-12-20 13:30:00', '2021-12-20 14:30:00'))
      
      df$timestamp <- as.POSIXct(df$timestamp)
      df$event_date <- as.Date(df$timestamp, format = "%Y-%m-%d")
      

      使用 data.table 的解决方案

      library(data.table)
      
      setDT(df)
      
      df[, .(mobility_events = max(rleid(event))), by = .(id, event_date)]
      

      输出

         id event_date mobility_events
      1:  1 2021-12-19               1
      2:  1 2021-12-20               1
      3:  2 2021-12-20               3
      

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 2018-11-27
        • 2013-06-03
        • 1970-01-01
        • 2012-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多