Маркировка строк на основе значения других строк - PullRequest
0 голосов
/ 13 мая 2019

У меня есть столбец с несколькими значениями, главное из которых содержит дату и имя. Для каждой строки этого фрагмента я хочу проверить остальные строки этого фрагмента, чтобы увидеть, совпадает ли какая-либо из других дат с данными плюс 60 секунд. Если это так, строка может быть помечена как не уникальная и удалена, если нет, строка помечена как уникальная.

Это должно быть сделано, пока все оставшиеся строки не будут помечены как уникальные.

С помощью dplyr и piping я сделал тиббл, но, похоже, не могу его правильно отфильтровать.

# 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 Ответ

1 голос
/ 13 мая 2019

Вы можете 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), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...