首页 > 解决方案 > 生成一个变量来计算连续条目

问题描述

假设我有以下数据集

df <- read.table(text="UTCDate  UTCTime   White   Black
    2018.01.01 03:49:40 JL  XN
    2018.01.01 03:52:01  XN JL
    2018.01.01 03:54:16 JL  XN
    2018.01.01 03:55:58  XN JL
    2018.01.01 03:57:59 JL  XN
    2018.01.01 04:00:27  XN JL
    2018.01.01 04:01:48 JL  XN
    2018.01.01 04:03:43  XN JL
    2018.01.01 04:06:12 JL  XN
    2018.01.01 09:21:16 JL  OC
    2018.01.01 09:22:28  OC JL
    2018.01.01 09:24:16 JL  OC
    2018.01.01 09:24:58  OC JL", header=T)

我正在尝试创建一个跟踪“连续游戏”的列,其中连续游戏被定义为,例如,距离前一个条目不到 10 分钟的任何条目。在这里,连续游戏是从某个玩家(例如 JL)的角度定义的,因此第 1 到第 9 行将在 consec_games 列中显示为 (1:9),第 10 到第 13 行将是 (1:4)。

“consecutive_games”列应仅适用于单个玩家(例如 JL)。所以应该是 JL_consecutive_games。这是一个大型数据集,其中多个玩家可能同时玩其他玩家。因此,连续游戏列必须仅适用于某些预先指定的玩家(在本例中为 JL)。

我见过这样的答案:利用滞后功能的组连续计数,但我不确定如何将滞后应用于此数据集。

标签: rdplyr

解决方案


仅在基础 R 中。
首先使用两个单独的列UTCDateUTCTime. 然后使用cumsum技巧来获取组。最后ave将函数 ( seq_along) 应用于由 定义的每个向量d

UTC <- paste(df$UTCDate, df$UTCTime)
UTC <- as.POSIXct(UTC, format = "%Y.%m.%d %H:%M:%S")

d <- c(0, difftime(UTC[-1], UTC[-length(UTC)], units = "mins"))
d <- cumsum(d > 10)

ave(seq_len(nrow(df)), d, FUN = seq_along)
#[1] 1 2 3 4 5 6 7 8 9 1 2 3 4

df$Games <- ave(seq_len(nrow(df)), d, FUN = seq_along)

rm(UTC, d)    # Tidy up

推荐阅读