我有一个包含多个值的小标题,最重要的是包含日期和名称。对于该小标题的每一行,我想检查该小标题的其他行,以查看其他日期是否等于数据加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
答案 0 :(得分:1)
您可以arrange
date
,减去date
和滞后的date
和filter
仅持续时间少于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), ]