R - 重复事件序列计算(迭代)

R - Sequences of repeated events calculation (iteration)

我正在处理一个大型数据集,我试图为其计算具有重复事件的会话持续时间。在数据收集过程中,一个会话由相同位置的具有相同 ID(A、B、C)的事件组成,间隔为 10 秒。我应该如何编码来计算第一个事件和最后一个事件之间的会话长度?在这种情况下,如果第二个按升序排序,持续时间实际上是最后一个事件,我需要额外添加 10 秒来说明下一个事件之前的时间。

For ex: Session A, duration = 50 + 10 = 60
        Session A, duration = 20 + 10 = 30
        Session B, duration = 30 + 10 = 40
        Session C, duration = 50 + 10 = 60

我认为使用函数 last() 然后将 10 添加到每个会话的最后一条记录可以是这个过程,但是由于每个会话都有不同数量的事件,我很难找出一个 iteration/code 用于整个数据集。

 Session_ID         Second           Position
 A                    10                 1
 A                    20                 1
 A                    30                 1 
 A                    40                 1
 A                    50                 1
 A                    10                 2
 A                    20                 2
 B                    10                 1
 B                    20                 1
 B                    30                 1
 C                    10                 3
 C                    20                 3
 C                    30                 3
 C                    40                 3
 C                    50                 3
            .
            .
            .

结果:

Session              Duration      Position
 A                     60              1
 A                     30              2
 B                     40              1
 C                     60              3
             .
             .
             .

我们可以使用 dplyr 执行以下操作:

library(dplyr)

df %>% 
  group_by(Session_ID, Position) %>% 
  filter(Second == max(Second)) %>% 
  mutate(Second = Second + 10)

或者,如果您的 Second 已排序,您可以 slice 每组的最后一行:

df %>% 
  group_by(Session_ID, Position) %>% 
  slice(n()) %>% 
  mutate(Second = Second + 10)

两种解决方案return:

# A tibble: 4 x 3
# Groups:   Session_ID, Position [4]
  Session_ID Second Position
  <chr>       <dbl>    <int>
1 A            60.0        1
2 A            30.0        2
3 B            40.0        1
4 C            60.0        3

但我会坚持使用第一个,因为您不必担心 Second 的顺序。

数据:

text <- "Session_ID         Second           Position
        A                    10                 1
        A                    20                 1
        A                    30                 1 
        A                    40                 1
        A                    50                 1
        A                    10                 2
        A                    20                 2
        B                    10                 1
        B                    20                 1
        B                    30                 1
        C                    10                 3
        C                    20                 3
        C                    30                 3
        C                    40                 3
        C                    50                 3"

df <- read.table(text = text, header = TRUE, stringsAsFactors = FALSE)