根据其他行的值标记行

时间:2019-05-13 13:03:04

标签: r dplyr

我有一个包含多个值的小标题,最重要的是包含日期和名称。对于该小标题的每一行,我想检查该小标题的其他行,以查看其他日期是否等于数据加60秒。如果是这样,则可以将该行标记为不唯一并删除,如果不是,则将该行标记为唯一。

应该这样做,直到所有剩余的行都标记为唯一。

通过dplyr和管道技术,我进行了小标题,但似乎无法对其进行正确过滤。

# A tibble: 9 x 3
  date                name      unique
  <dttm>              <chr>     <lgl> 
1 2019-05-10 17:57:00 Item Name FALSE 
2 2019-05-10 17:57:00 Item Name FALSE 
3 2019-05-10 18:11:00 Item Name FALSE 
4 2019-05-10 18:12:00 Item Name FALSE 
5 2019-05-10 18:13:00 Item Name FALSE 
6 2019-05-10 18:13:00 Item Name FALSE 
7 2019-05-10 18:14:00 Item Name FALSE 
8 2019-05-10 18:14:00 Item Name FALSE 
9 2019-05-10 18:15:00 Item Name FALSE 

因此,此小标题显示为预过滤器,所有唯一值仍设置为false。现在从本质上讲,我想跑步;

lookup <- rawlist %>%
  filter(date == date + 60)

在每一行上,逐行,如果结果返回的行数大于0,则将该行标记为不唯一并将其删除。如果返回为0,则将其标记为唯一。

很显然,这是行不通的,因为它只是将日期与其每一行进行比较。我感觉好像在这里缺少某种递归方法。

另一个要注意的是,如果某行已被标记为唯一,则不应将其视为该函数的匹配项。

因此,第1行和第2行应标记为唯一。 而第3行则不应,因为第4行多出60秒。

中间的小标题应该看起来像这样,但我无法理解这一点;

# A tibble: 9 x 3
  date                name      unique
  <dttm>              <chr>     <lgl> 
1 2019-05-10 17:57:00 Item Name TRUE 
2 2019-05-10 17:57:00 Item Name TRUE 
3 2019-05-10 18:11:00 Item Name FALSE 
4 2019-05-10 18:12:00 Item Name FALSE 
5 2019-05-10 18:13:00 Item Name FALSE 
6 2019-05-10 18:13:00 Item Name FALSE 
7 2019-05-10 18:14:00 Item Name FALSE 
8 2019-05-10 18:14:00 Item Name TRUE
9 2019-05-10 18:15:00 Item Name TRUE 

所需的小标题看起来像这样;

# A tibble: 9 x 3
  date                name      unique
  <dttm>              <chr>     <lgl> 
1 2019-05-10 17:57:00 Item Name TRUE 
2 2019-05-10 17:57:00 Item Name TRUE
8 2019-05-10 18:14:00 Item Name TRUE 
9 2019-05-10 18:15:00 Item Name TRUE 

1 个答案:

答案 0 :(得分:1)

您可以arrange date,减去date和滞后的datefilter仅持续时间少于60秒的行。

library(dplyr)

df %>%
  arrange(date) %>%
  filter(difftime(date, lag(date, default = first(date)), unit = "secs") < 60)

如果要添加列unique

df %>%
  arrange(date) %>%
  mutate(unique = difftime(date, lag(date, default = first(date)), 
                   units = "secs") < 60) %>%
  filter(unique)

或在基数R

df1 <- df[order(df$date), ]
df[c(TRUE, difftime(df1$date[-1], df$date[-nrow(df)], units = "secs") < 60), ]