Сравнить строку в том же столбце - PullRequest
0 голосов
/ 21 мая 2018

У меня есть data.frame, как показано ниже:

x=data.frame(Time=c("2017-09-01 09:21:03","2018-05-05 05:58:59","2018-01-01 12:06:46",
                    "2017-09-01 09:21:11","2018-01-01 12:10:12","2018-05-05 05:55:50"),
                     First=c("X1","X2","X3","X1","X3","X2"),
                     Second=c("A1","A2","B3","A1","B3","C4"))
output:
        Time                First     Second
 1   2017-09-01 09:21:03      X1        A1
 2   2018-05-05 05:58:59      X2        A2
 3   2018-01-01 12:06:46      X3        B3
 4   2017-09-01 09:23:11      X1        A1
 5   2018-01-01 12:20:12      X3        B3
 6   2018-05-05 05:55:50      X2        C4

Я хочу сравнить Если текущая строка со следующей строкой (в том же столбце),

И разница во времени меньше, чемЧерез 5 минут

сгенерирует новый фрейм данных и рассчитает столько же раз

И получит:

First      Second     n
 X1          A1       2   #(original row 1 and row 4)
 X2          A2       1   #(original row 2)
 X3          B3       1   #(original row 3)
 X3          B3       1   #(original row 5)
 X2          C4       1   #(original row 6)

Поскольку время между строкой 3 и строкой 5 равноболее 5 минут, поэтому разные записи.

И время между строкой 1 и строкой 4 составляет менее 5 минут, поэтому такие же записи

Я нашел статью stackoverflow, но я все еще нене знаю, как его написать.

R сравнить текущую строку со следующей строкой (в том же столбце)

1 Ответ

0 голосов
/ 21 мая 2018

Я попал туда с dplyr.Немного сложно получить ожидаемый результат.Я надеюсь, что есть более простой способ.Может быть, кто-то с лучшими знаниями data.table может предоставить решение data.table.

Сначала создайте групповой оператор, чтобы вычислить разницу во времени в минутах, и если для значения меньше 5 минут установлено значение 0. Это гарантирует, что записив течение 5 минут получите ту же минуту.Затем избавьтесь от времени и расширите группировку, включив минутыПодсчитайте, сколько записей попадает в эти группы.Удалите минуты из группировки, сделайте отдельное, чтобы избавиться от двойных записей X1 A1 и, наконец, удалите столбец min.

library(dplyr)

df %>% 
  group_by(First, Second) %>% 
  mutate(min = (Time - lag(Time, default = first(Time)))/60,
         min = ifelse(min < 5, 0, min)) %>% 
  select(-Time) %>% 
  group_by(First, Second, min) %>% 
  mutate(n = n()) %>% 
  ungroup(min) %>% 
  distinct() %>% 
  select(-min)

# A tibble: 5 x 3
  First Second     n
  <chr> <chr>  <int>
1 X1    A1         2
2 X2    A2         1
3 X3    B3         1
4 X3    B3         1
5 X2    C4         1

Данные:

df <- structure(list(Time = structure(c(1504250463, 1525492739, 1514804806, 1504250591, 1514805612, 1525492550), 
                                      class = c("POSIXct", "POSIXt"), tzone = ""), 
                     First = c("X1", "X2", "X3", "X1", "X3", "X2"), 
                     Second = c("A1", "A2", "B3", "A1", "B3", "C4")), 
                .Names = c("Time", "First", "Second"), 
                row.names = c(NA, -6L), 
                class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...