数据集的复杂条件过滤

时间:2019-07-18 13:52:12

标签: r filtering

我有一个交互数据集,其中许多是我需要过滤掉的伪复制品。我需要确定(然后删除)所有在同一时间窗口(例如10秒)内与同一个人发生相同互动的实例,但前提是这些互动是连续的(如果它们之间发生另一互动,则不会重复) )。

我的数据外观如下所示:

  Datetime      Interaction   Individual 
1 190513064553  DUAL_SUCCESS  01151e00
2 190513064605  SOLO_SUCCESS  078c6700
3 190513064609  SOLO_SUCCESS  01151e00
4 190513064613  SOLO_SUCCESS  078c6700
5 190513071534  SOLO_SUCCESS  078c6700   
6 190513071541  SOLO_SUCCESS  078c6700

因此,在此示例中,如果窗口为10秒,则该过程将过滤掉第6行,而不是第3或4行,因为尽管第4行看起来是2的副本并且在10秒之内,但它被a分割。不同的人。

我意识到这是一种利基的情况,但是任何建议都将不胜感激:)

1 个答案:

答案 0 :(得分:0)

数据集的简短版本:

Datetime<- c(190513064553,  190513064605, 190513064609, 190513064633)
Interaction <- c("DUAL_SUCCESS", "SOLO_SUCCESS", "SOLO_SUCCESS", "SOLO_SUCCESS")
Individual <- c (1,2,3,3)
df <- data.frame(Datetime, Interaction, Individual)

第1步:创建其他列:

df %>% 
  mutate(time_window = Datetime - lag(Datetime),
         same_int = (Interaction == lag(Interaction)),
         same_ind = (Individual == lag(Individual)))

      Datetime  Interaction Individual time_window same_int same_ind
1 190513064553 DUAL_SUCCESS          1          NA       NA       NA
2 190513064605 SOLO_SUCCESS          2          52    FALSE    FALSE
3 190513064609 SOLO_SUCCESS          3           4     TRUE    FALSE
4 190513064633 SOLO_SUCCESS          3          24     TRUE     TRUE

第2步:按新列过滤数据集

df %>% 
  mutate(time_window = Datetime - lag(Datetime),
         same_int = (Interaction == lag(Interaction)),
         same_ind = (Individual == lag(Individual))) %>%
  filter(!(time_window > 10 & !is.na(time_window) & same_int & same_ind))

      Datetime  Interaction Individual time_window same_int same_ind
1 190513064553 DUAL_SUCCESS          1          NA       NA       NA
2 190513064605 SOLO_SUCCESS          2          52    FALSE    FALSE
3 190513064609 SOLO_SUCCESS          3           4     TRUE    FALSE

如有必要,现在可以通过添加%>% select(-c(time_window, same_int, same_ind))

来删除新创建的列