【问题标题】:How to calculate elapsed times for the total duration of events?如何计算事件总持续时间的经过时间?
【发布时间】:2018-03-22 22:17:08
【问题描述】:

我收集了一个数据框,该数据框对小组问题解决会话中的事件持续时间进行建模,在该会话中,成员进行沟通 (Discourse Code) 并构建模型 (Modeling Code)。发生的每一分钟都记录在Time_Processed 列中。从技术上讲,这些事件同时发生。我想知道学生构建每种类型的模型需要多长时间,即该模型的总持续时间或该模型更改之前经过的时间。

我有以下数据集:

看起来像这样:

 `Modeling Code` `Discourse Code` Time_Processed
   <fct>           <fct>                     <dbl>
 1 OFF             OFF                        10.0
 2 MA              Q                          11.0
 3 MA              AG                         16.0
 4 V               S                          18.0
 5 V               Q                          20.0
 6 MA              C                          21.0
 7 MA              C                          23.0
 8 MA              C                          25.0
 9 V               J                          26.0
10 P               S                          28.0

# My explicit dataframe. 
df <- structure(list(`Modeling Code` = structure(c(3L, 2L, 2L, 6L, 
6L, 2L, 2L, 2L, 6L, 4L), .Label = c("A", "MA", "OFF", "P", "SM", 
"V"), class = "factor"), `Discourse Code` = structure(c(7L, 8L, 
1L, 9L, 8L, 2L, 2L, 2L, 6L, 9L), .Label = c("AG", "C", "D", "DA", 
"G", "J", "OFF", "Q", "S"), class = "factor"), Time_Processed = c(10, 
11, 16, 18, 20, 21, 23, 25, 26, 28)), row.names = c(NA, -10L), .Names = c("Modeling Code", 
"Discourse Code", "Time_Processed"), class = c("tbl_df", "tbl", 
"data.frame"))

对于这个数据框,我可以找到学生按照这样的逻辑构建每种类型的模型的频率。

关于Modeling CodeTime_Processed 列,

他们在 10 分钟时使用 OFF 模型方法,然后在 11 分钟时,他们更改模型,因此 OFF 模型的持续时间为 (11 - 10) 分钟 = 1 分钟。没有出现其他“OFF”方法,因此 OFF 的持续时间 = 1 分钟

同样,对于建模代码方法“MA”,模型使用时间为 11 分钟到 16 分钟(持续时间 = 5 分钟),然后在模型更改为 V 之前的 16 分钟到 18 分钟(持续时间 = 2 分钟) ,然后模型在 21 分钟时再次使用并在 26 分钟时结束(持续时间 = 5 分钟)。所以“MA”的总持续时间是 (5 + 2 + 5) 分钟 = 12 分钟

同样,建模代码方法“V”的持续时间从 18 分钟开始,在 21 分钟结束(持续时间 = 3 分钟),在 26 分钟恢复,在 28 分钟(持续时间 = 2)分钟结束。所以“V”的总时长是 3 + 2 = 5 分钟

那么建模代码P的持续时间,从28分钟开始,没有连续性,所以P的总持续时间是0分钟

所以建模代码的总持续时间(分钟)表是这样的:

Modeling Code     Total_Duration
    OFF               1
    MA               12
    V                 5 
    P                 0 

这模拟了一个如下所示的条形图:

如何构建这些建模方法的总持续时间?

知道组合的持续时间也很好 因此,这个小子集中唯一可见的组合恰好是建模代码“MA”与话语代码“C”配对,并且持续 26 - 21 = 5 分钟。

谢谢。

【问题讨论】:

  • 你需要努力澄清这个过程。如果答案只是“建模代码”的表格,那么它似乎微不足道,但是您有一个“话语”变量,其在其中的作用没有得到很好的解释。
  • 嗯,这是一个表格,但我想知道如何计算每个分类变量的总经过时间。如果我能弄清楚如何做到这一点,那么我也可以将它应用于话语变量。我只想知道它们在解决问题的过程中出现的频率。

标签: r dplyr


【解决方案1】:

更新的解决方案

df %>% 
  mutate(dur = lead(Time_Processed) - Time_Processed) %>% 
  replace_na(list(dur = 0)) %>% 
  group_by(`Modeling Code`) %>% 
  summarise(tot_time = sum(dur))

(^ 感谢Nick DiQuattro)

以前的解决方案
这是一个创建新变量mcode_grp 的解决方案,它跟踪相同Modeling Code 的离散分组。它不是特别漂亮——它需要遍历df 中的每一行——但它确实有效。

首先,重命名列以方便参考:

df <- df %>%
  rename(m_code = `Modeling Code`,
         d_code = `Discourse Code`)

我们将使用一些额外的变量更新 df
- lead_time_proc 为我们提供了 Time_Processed 中下一行的 df 值,我们在计算每个 m_code 批次的总时间时需要它
- row_n 用于在我们的迭代中跟踪行号
- mcode_grp 是每个 m_code 批次的唯一标签

df <- df %>%
  mutate(lead_time_proc = lead(Time_Processed),
         row_n = row_number(),
         mcode_grp = "") 

接下来,我们需要一种方法来跟踪我们何时达到了给定m_code 值的新批次。一种方法是为每个m_code 保留一个计数器,并在到达新批次时将其递增。然后我们可以将m_code 批次的所有行标记为属于同一时间窗口。

mcode_ct <- df %>% 
  group_by(m_code) %>% 
  summarise(ct = 0) %>%
  mutate(m_code = as.character(m_code))

这是最丑的部分。我们遍历df 中的每一行,并检查我们是否到达了新的m_code。如果是这样,我们会相应地更新,并为每一行注册一个 mcode_grp 的值。

mc <- ""
for (i in 1:nrow(df)) {
  current_mc <- df$m_code[i]
  if (current_mc != mc) {
    mc <- current_mc
    mcode_ct <- mcode_ct %>% mutate(ct = ifelse(m_code == mc, ct + 1, ct))
    current_grp <- mcode_ct %>% filter(m_code == mc) %>% select(ct) %>% pull()
  }
  df <- df %>% mutate(mcode_grp = ifelse(row_n == i, current_grp, mcode_grp))
}

最后,group_by m_codemcode_grp 计算每个批次的持续时间,然后对 m_code 的值求和。

 df %>%
   group_by(m_code, mcode_grp) %>%
   summarise(start_time = min(Time_Processed),
             end_time = max(lead_time_proc)) %>%
   mutate(total_time = end_time - start_time) %>%
   group_by(m_code) %>%
   summarise(total_time = sum(total_time)) %>%
   replace_na(list(total_time=0))

输出:

# A tibble: 4 x 2
  m_code total_time
  <fct>       <dbl>
1 MA            12.
2 OFF            1.
3 P              0.
4 V              5.

对于任何dplyr/tidyverse 专家,我很想知道如何在不使用循环和计数器的情况下完成更多任务!

【讨论】:

  • 哇,这太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多