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)
我正在处理一个大型数据集,我试图为其计算具有重复事件的会话持续时间。在数据收集过程中,一个会话由相同位置的具有相同 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)