Как составить количество наблюдений, которые следуют определенной схеме? - PullRequest
1 голос
/ 22 мая 2019

У меня есть набор данных с тремя переменными (DateTime, Transmitter и timediff). Столбец timediff - это разница во времени между последующими обнаружениями передатчика. Я хочу знать, сколько раз разница во времени соответствовала определенной схеме. Вот образец моих данных.

> dput(Example)
structure(list(DateTime = structure(c(1501117802, 1501117805, 
1501117853, 1501117857, 1501117913, 1501117917, 1501186253, 1501186254, 
1501186363, 1501186365, 1501186541, 1501186542, 1501186550, 1501186590, 
1501186591, 1501186644, 1501186646, 1501186737, 1501186739, 1501187151
), class = c("POSIXct", "POSIXt"), tzone = "GMT"), Transmitter = c(30767L, 
30767L, 30767L, 30767L, 30767L, 30767L, 30767L, 30767L, 30767L, 
30767L, 30767L, 30767L, 30767L, 30767L, 30767L, 30767L, 30767L, 
30767L, 30767L, 30767L), timediff = c(44, 3, 48, 4, 56, 4, 50, 
1, 42, 2, 56, 1, 8, 40, 1, 53, 2, 37, 2, 42)), row.names = c(NA, 
20L), class = "data.frame")

Итак, взглянув на столбец разницы во времени, я хочу узнать, сколько раз будет один временной интервал <8 секунд, сколько раз будет два следующих интервала времени <8 секунд, сколько раз будет три последующих интервала времени <8 секунд, и т. д. </p>

Пример. В данном наборе данных один временной интервал <8 секунд происходит 7 раз, а два последующих временных интервала <8 секунд - дважды. </p>

«Единый временной интервал» = 44, 3 , 48

A "двойной таймдифф" = 56, 1 , 8 , 40

Что касается вывода, я бы искал что-то вроде этого ...

> dput(output)
structure(list(ID = 30767, Single = 7, Double = 2), class = "data.frame", row.names = c(NA, 
-1L))

Спасибо за помощь!

1 Ответ

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

Одна dplyr возможность может быть:

df %>%
 mutate(cond = timediff <= 8) %>%
 group_by(rleid = with(rle(cond), rep(seq_along(lengths), lengths))) %>%
 add_count(rleid, name = "n_timediff") %>%
 filter(cond & row_number() == 1) %>%
 ungroup() %>%
 count(n_timediff)

n_timediff     n
       <int> <int>
1          1     8
2          2     1

Учитывая, что в «Преобразователе» может быть больше значений, вы можете сделать (для этого также требуется tidyr):

df %>%
 mutate(cond = timediff <= 8) %>%
 group_by(Transmitter, rleid = with(rle(cond), rep(seq_along(lengths), lengths))) %>%
 add_count(rleid, name = "n_timediff") %>%
 filter(cond & row_number() == 1) %>%
 ungroup() %>%
 group_by(Transmitter) %>%
 count(n_timediff) %>%
 mutate(n_timediff = paste("timediff", n_timediff, sep = "_")) %>%
 spread(n_timediff, n)

  Transmitter timediff_1 timediff_2
        <int>      <int>      <int>
1       30767          8          1
...