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

时间:2018-02-03 07:24:25

标签: r dataframe dplyr sequence tidyverse

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

export PATH="$HOME/.rbenv/bin:$PATH"

我认为使用函数last()然后将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

结果:

 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
            .
            .
            .

1 个答案:

答案 0 :(得分:2)

我们可以使用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)

两种解决方案都返回:

# 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)