我有这样的数据:
player event diff
A x NA
A y 2
A z 240
A w 3
A x 9
B x NA
B y 3
B z 120
C x NA
C x 8我所做的是按照玩家列进行分组,并获取时间事件之间的差异,因此每当新玩家有事件时,NA for diff列。
我想要做的是将数据划分为特定于玩家的交互,这些交互彼此之间不超过几分钟(假设diff =20的分界值)。我最终想要的是:
player event diff interaction
A x NA 1
A y 2 1
A z 240 2
A w 3 2
A x 9 2
B x NA 1
B y 3 1
B z 120 2
C x NA 1
C x 8 1因此,基本上交互是基于具有相同玩家的分组,并且差异小于20,否则开始新的交互。如果存在安娜,则还将开始新的交互。我真的不确定如何以一种快速/有效的方式做到这一点,因为我有一个包含许多玩家的大型数据集。我更喜欢dplyr解决方案
发布于 2016-09-18 09:20:00
您可以使用diff列中的coalesce将NA替换为0(或其他低于阈值的数字),并对diff >= 20条件执行累积和,这将在diff超过某个阈值时提供一个不同的id:
library(dplyr)
df %>% group_by(player) %>%
mutate(interaction = cumsum(coalesce(diff, 0L) >= 20) + 1)
# Source: local data frame [10 x 4]
# Groups: player [3]
# player event diff interaction
# <fctr> <fctr> <int> <dbl>
# 1 A x NA 1
# 2 A y 2 1
# 3 A z 240 2
# 4 A w 3 2
# 5 A x 9 2
# 6 B x NA 1
# 7 B y 3 1
# 8 B z 120 2
# 9 C x NA 1
# 10 C x 8 1发布于 2016-09-18 11:28:09
我们还可以使用base R来获得预期的输出
df1$interaction <- with(df1, ave(diff, player, FUN = function(x)
cumsum(x > 20 & !is.na(x))+1))
df1$interaction
#[1] 1 1 2 2 2 1 1 2 1 1https://stackoverflow.com/questions/39553152
复制相似问题