R - Как рассчитать частоту появления в течение определенного временного шага - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть фрейм данных с определенной переменной (Var1) и переменной времени (Var2).

Я хотел бы рассчитать частоту появления (Частота) Var1 с определенным временным шагом (скажем, 1 минута) в течение года.

образец набора данных:

Var1 <- c(rep("A", 4), rep("B", 3), rep("C", 2)) 
Var2 <- c("2018-09-01 10:00:00", "2018-09-01 10:00:30", "2018-09-01 10:00:45", 
    "2018-09-10 22:10:00", "2017-09-05 10:54:30", "2018-12-15 10:00:30", 
    "2018-12-15 10:01:00", "2017-02-20 17:16:30", "2017-12-20 20:08:56") 
df <- data.frame(Var1, Var2) 
df$Var2 <- as.POSIXct(df$Var2)

желаемый вывод:

Frequency <- c(rep(3, 3), rep(1, 2), rep(2,2), rep(1,2)) 
dfOut <- data.frame(Var1, Var2, Frequency) 

#  Var1                Var2 Frequency
#1    A 2018-09-01 10:00:00         3
#2    A 2018-09-01 10:00:30         3
#3    A 2018-09-01 10:00:45         3
#4    A 2018-09-10 22:10:00         1
#5    B 2017-09-05 10:54:30         1
#6    B 2018-12-15 10:00:30         2
#7    B 2018-12-15 10:01:00         2
#8    C 2017-02-20 17:16:30         1
#9    C 2017-12-20 20:08:56         1

Ответы [ 3 ]

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

Вот подход data.table.Сначала вы можете создать индекс, показывающий, является ли datetime для следующей строки 1 минутой после datetime текущей строки.Затем используйте это как один из критериев группировки для расчета частоты.

library(data.table)
setDT(df)[, idx := cumsum(c(0L, Var2[-1L] > Var2[-.N] + 60L)), by=.(Var1)][, 
    Freq := .N, by=.(Var1, idx)]

output:

   Var1                Var2 idx Freq
1:    A 2018-09-01 10:00:00   0    3
2:    A 2018-09-01 10:00:30   0    3
3:    A 2018-09-01 10:00:45   0    3
4:    A 2018-09-10 22:10:00   1    1
5:    B 2017-09-05 10:54:30   0    1
6:    B 2018-12-15 10:00:30   1    2
7:    B 2018-12-15 10:01:00   1    2
8:    C 2017-02-20 17:16:30   0    1
9:    C 2017-12-20 20:08:56   1    1
0 голосов
/ 11 сентября 2018

Вы можете использовать lubridate::floor_date, чтобы получить столбец минутной группировки, в котором указана дата, которую вы описываете. Обратите внимание, что отображаемый вами желаемый результат не соответствует вашему комментарию

Var1 <- c(rep("A", 4), rep("B", 3), rep("C", 2)) 
Var2 <- c("2018-09-01 10:00:00", "2018-09-01 10:00:30", "2018-09-01 10:00:45", 
          "2018-09-10 22:10:00", "2017-09-05 10:54:30", "2018-12-15 10:00:30", 
          "2018-12-15 10:01:00", "2017-02-20 17:16:30", "2017-12-20 20:08:56") 
df <- data.frame(Var1, Var2) 
df$Var2 <- as.POSIXct(df$Var2)

library(tidyverse)
library(lubridate)

df %>%
  mutate(minute = floor_date(Var2, unit = "minute")) %>%
  add_count(Var1, minute)
#> # A tibble: 9 x 4
#>   Var1  Var2                minute                  n
#>   <fct> <dttm>              <dttm>              <int>
#> 1 A     2018-09-01 10:00:00 2018-09-01 10:00:00     3
#> 2 A     2018-09-01 10:00:30 2018-09-01 10:00:00     3
#> 3 A     2018-09-01 10:00:45 2018-09-01 10:00:00     3
#> 4 A     2018-09-10 22:10:00 2018-09-10 22:10:00     1
#> 5 B     2017-09-05 10:54:30 2017-09-05 10:54:00     1
#> 6 B     2018-12-15 10:00:30 2018-12-15 10:00:00     1
#> 7 B     2018-12-15 10:01:00 2018-12-15 10:01:00     1
#> 8 C     2017-02-20 17:16:30 2017-02-20 17:16:00     1
#> 9 C     2017-12-20 20:08:56 2017-12-20 20:08:00     1

Создано в 2018-09-11 пакетом Представ. (v0.2.0).

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

Вы можете сделать что-то вроде этого.Создайте новый символьный вектор для определения групп, затем сгруппируйте по Var1 и новой переменной.Это не дает желаемого результата, потому что минуты определены по-разному.

    library(dplyr)
    df %>% 
      mutate(minute = substring(as.character(Var2), 1, 16)) %>% 
      group_by(Var1, minute) %>% 
      mutate(frequency = n())
...