Подсчитать количество строк для каждой строки, которые соответствуют логическому условию - PullRequest
0 голосов
/ 25 сентября 2018

Итак, у меня есть некоторые данные с отметкой времени, и для каждой строки я хочу подсчитать количество строк, попадающих в определенное временное окно.Например, если у меня есть данные ниже с отметкой времени в ч: мм (столбец ts), я хочу подсчитать количество строк, которые произошли от этой отметки времени до пяти минут в прошлом (столбец count),Первые n строк, которые находятся менее чем в пяти минутах от первой точки данных, должны быть NA.

ts    data  count
1:01   123      NA
1:02   123      NA
1:03   123      NA
1:04   123      NA
1:06   123      5
1:07   123      5
1:10   123      3
1:11   123      4
1:12   123      4

Это просто сделать с помощью цикла for, но я пытался реализовать с помощью apply() семьи и пока не нашли никакого успеха.Есть предложения?

1 Ответ

0 голосов
/ 25 сентября 2018

РЕДАКТИРОВАТЬ: изменено, чтобы учесть потенциал для нескольких чтений в минуту, поднятый в комментарии.

Данные с новым чтением в середине минуты:

library(dplyr)
df %>%
  # Take the text above and convert to datetime 
  mutate(ts = lubridate::ymd_hms(paste(Sys.Date(), ts))) %>%

  # Count how many observations per minute
  group_by(ts_min = lubridate::floor_date(ts, "1 minute")) %>%
  summarize(obs_per_min = sum(!is.na(data))) %>%

  # Add rows for any missing minutes, count as zero observations
  padr::pad(interval = "1 min") %>%
  replace_na(list(obs_per_min = 0)) %>%

  # Count cumulative observations, and calc how many in window that 
  #  begins 5 minutes ago and ends at end of current minute
  mutate(cuml_count = cumsum(obs_per_min),
         prior_cuml = lag(cuml_count) %>% tidyr::replace_na(0),
         in_window  = cuml_count - lag(prior_cuml, 5)) %>%

  # Exclude unneeded columns and rows
  select(-cuml_count, -prior_cuml) %>%
  filter(obs_per_min > 0)

Вывод (теперь отражает добавление 'Я читаю в 1:06:30)

# A tibble: 12 x 3
    ts_min              obs_per_min in_window
<dttm>                    <dbl>     <dbl>
1 2018-09-26 01:01:00           1        NA
2 2018-09-26 01:02:00           1        NA
3 2018-09-26 01:03:00           1        NA
4 2018-09-26 01:04:00           1        NA
5 2018-09-26 01:06:00           2         6
6 2018-09-26 01:07:00           1         6
7 2018-09-26 01:10:00           1         4
8 2018-09-26 01:11:00           1         5
9 2018-09-26 01:12:00           1         4
...