所以我有 2 个字段的数据,ID 和时间戳
ID Time
1 12
1 15
1 16
2 12
2 11
例如,在相同的 ID 中,如果时间和以前时间之间的差异低于 2,我想增加,除非保持相同的值并在 ID 不同时从 1 重新启动。
期望输出:
ID Time ID_SESSION
1 12 1
1 15 1
1 16 2
2 12 1
2 11 1
在 dplyr/sparklyr 中需要它才能使用 R/实现
使用基数 R 的单行代码,
with(df, ave(Time, ID, FUN = function(i)cumsum(c(TRUE, diff(i) <= 2))))
#[1] 1 1 2 1 2
也许我们需要
library(dplyr)
df1 %>%
group_by(ID) %>%
mutate(ID_SESSION = (lag(c(FALSE, diff(Time) > 2), default= FALSE)) + 1)
或者在带有data.table
的单行中
library(data.table)
setDT(df1)[, ID_SESSION := shift(c(FALSE, diff(Time) > 2), fill = FALSE) + 1, ID]
df1
# ID Time ID_SESSION
#1: 1 12 1
#2: 1 15 1
#3: 1 16 2
#4: 2 12 1
#5: 2 11 1
数据
df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L), Time = c(12L, 15L,
16L, 12L, 11L)), class = "data.frame", row.names = c(NA, -5L))