当同一会话的第一个timestamp和随后的timestamp记录之间的差异超过10个单位时,我想在session列中添加1。
换句话说:
如果在同一个会话中,timestamp列的间隔大于10,那么对于特定的ID,将1加到其余的会话中。因此,我们不应该有相同的session,并且其记录中的间隔不应该大于10。
让我们说:
df<-read.table(text="
ID timestamp session
1 10 1
1 12 1
1 15 1
1 21 1
1 25 1
1 27 2
1 29 2
2 11 1
2 22 2
2 27 2
2 32 2
2 42 2
2 43 3",header=T,stringsAsFactors = F)在上面的示例中,对于ID==1,第4行(timestamp==21)中第一条记录(timestamp==10)的会话间隔大于10,因此我们将其余会话加1。每次会话号改变时,时间戳的第一条记录的差值应在相同的情况下小于10,否则应添加到会话中。
result:
ID timestamp session
1 *10 1
1 12 1
1 15 1
1 *21 2 <-- because 21-10 >= 10 it add 1 to the rest of sessions in this ID
1 25 2
1 27 3
1 29 3
2 11 1
2 *22 2
2 27 2
2 *32 3 <-- because 32-22>= 10 it add 1 to the rest of session
2 *42 4 <-- because 42-32>=10
2 43 5我怎么才能在R中做呢?
发布于 2020-09-26 05:12:12
也许自定义函数可能会有帮助,它可以计算累积和,并在达到阈值时重置。在这种情况下,如果您为函数提供session数据,它将提供一个结果,其中将包括会话的累积“偏移量”,但仅在会话编号没有增加时以行为单位。这解决了ID 2 timestamp 22的情况,其中差值大于10,但是会话数从1增加到2。
library(tidyverse)
threshold <- 10
cumsum_with_reset <- function(x, session, threshold) {
cumsum <- 0
group <- 0
result <- numeric()
for (i in seq_along(x)) {
cumsum <- cumsum + x[i]
if (cumsum >= threshold) {
if (session[i] == session[i-1]) {
group <- group + 1
}
cumsum <- 0
}
result = c(result, group)
}
return (result)
}
df %>%
group_by(ID) %>%
mutate(diff = c(0, diff(timestamp)),
cumdiff = cumsum_with_reset(diff, session, threshold),
new_session = cumdiff + session)改编自this solution的函数。
输出
ID timestamp session diff cumdiff new_session
<int> <int> <int> <dbl> <dbl> <dbl>
1 1 10 1 0 0 1
2 1 12 1 2 0 1
3 1 15 1 3 0 1
4 1 21 1 6 1 2
5 1 25 1 4 1 2
6 1 27 2 2 1 3
7 1 29 2 2 1 3
8 2 11 1 0 0 1
9 2 22 2 11 0 2
10 2 27 2 5 0 2
11 2 32 2 5 1 3
12 2 42 2 10 2 4
13 2 43 3 1 2 5https://stackoverflow.com/questions/64069332
复制相似问题