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