【问题标题】:Complex conditional filtering of dataset数据集的复杂条件过滤
【发布时间】:2019-07-18 13:52:12
【问题描述】:

我有一个交互数据集,其中许多是我需要过滤掉的伪复制。我需要识别(然后删除)在某个时间窗口(例如 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 秒内,但它被分割为不同的个体。

我意识到这是一个小众情况,但任何建议都将不胜感激:)

【问题讨论】:

  • 不能只将这些数据粘贴到 R 中。请提供一个可重现的示例以更方便

标签: r filtering


【解决方案1】:

数据集的稍短版本:

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

如有必要,现在可以通过添加 %&gt;% select(-c(time_window, same_int, same_ind)) 来删除新创建的列

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2020-10-11
    • 2019-11-20
    • 2023-02-10
    • 2011-03-11
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多