Вам не нужны никакие пакеты для этого. Я прочитал в вашем df
, но установил опцию stringsAsFactors
.
df <- read.table(text =
"timestampUTC location ID
'2017-10-11 04:57:16' JB12 A69-1602-2429
## ...
'2017-10-11 05:07:32' WBR A69-1602-2428",
header = TRUE, stringsAsFactors = FALSE)
Теперь скажите R, что первый столбец является меткой времени, а затем округлите метку времени.
df[["timestampUTC"]] <- as.POSIXct(df[["timestampUTC"]], tz = "UTC")
df[["timestampUTC"]] <- trunc(df[["timestampUTC"]], "hours")
Затем вызовите table
и преобразуйте результат в фрейм данных.
result <- as.data.frame(table(df))
## timestampUTC location ID Freq
## 1 2017-10-11 04:00:00 JB12 A69-1601-47280 0
## 2 2017-10-11 05:00:00 JB12 A69-1601-47280 0
## 3 2017-10-11 04:00:00 JB13 A69-1601-47280 4
## 4 2017-10-11 05:00:00 JB13 A69-1601-47280 4
## 5 2017-10-11 04:00:00 WBR A69-1601-47280 0
## 6 2017-10-11 05:00:00 WBR A69-1601-47280 0
## 7 2017-10-11 04:00:00 JB12 A69-1602-2425 0
## 8 2017-10-11 05:00:00 JB12 A69-1602-2425 0
## 9 2017-10-11 04:00:00 JB13 A69-1602-2425 0
## 10 2017-10-11 05:00:00 JB13 A69-1602-2425 0
## 11 2017-10-11 04:00:00 WBR A69-1602-2425 2
## 12 2017-10-11 05:00:00 WBR A69-1602-2425 2
## 13 2017-10-11 04:00:00 JB12 A69-1602-2428 0
## 14 2017-10-11 05:00:00 JB12 A69-1602-2428 0
## 15 2017-10-11 04:00:00 JB13 A69-1602-2428 0
## 16 2017-10-11 05:00:00 JB13 A69-1602-2428 0
## 17 2017-10-11 04:00:00 WBR A69-1602-2428 3
## 18 2017-10-11 05:00:00 WBR A69-1602-2428 6
## 19 2017-10-11 04:00:00 JB12 A69-1602-2429 3
## 20 2017-10-11 05:00:00 JB12 A69-1602-2429 3
## 21 2017-10-11 04:00:00 JB13 A69-1602-2429 0
## 22 2017-10-11 05:00:00 JB13 A69-1602-2429 1
## 23 2017-10-11 04:00:00 WBR A69-1602-2429 0
## 24 2017-10-11 05:00:00 WBR A69-1602-2429 0
Если вы хотите включить ID
, скажем, который никогда не появлялся в данных, вам нужно сказать table
какие значения для ID
возможны. Вы можете сделать это, задав ID
фактор.
df[["ID"]] <- factor(df[["ID"]],
levels = c("A69-1602-2429", "A69-1601-47280",
"A69-1602-2428", "A69-1602-2425",
"foo"))
Или для дополнительных часов:
df[["timestampUTC"]] <-
factor(df[["timestampUTC"]],
levels =
seq(from = as.POSIXct("2017-10-01 00:00:00", tz = "UTC"),
to = as.POSIXct("2017-10-03 00:00:00", tz = "UTC"),
by = "1 hour"))
Результаты будут включать нулевые отсчеты.
## ...
## 25 2017-10-11 04:00:00 JB12 foo 0
## 26 2017-10-11 05:00:00 JB12 foo 0
## 27 2017-10-11 04:00:00 JB13 foo 0
## 28 2017-10-11 05:00:00 JB13 foo 0
## 29 2017-10-11 04:00:00 WBR foo 0
## 30 2017-10-11 05:00:00 WBR foo 0
Вместо переменной ноль-один для present
я бы предложил логический вектор:
present <- result$Freq > 0
cbind(result, present)
## timestampUTC location ID Freq present
## 1 2017-10-11 04:00:00 JB12 A69-1601-47280 0 FALSE
## 2 2017-10-11 05:00:00 JB12 A69-1601-47280 0 FALSE
## 3 2017-10-11 04:00:00 JB13 A69-1601-47280 4 TRUE
## 4 2017-10-11 05:00:00 JB13 A69-1601-47280 4 TRUE
## 5 2017-10-11 04:00:00 WBR A69-1601-47280 0 FALSE
## ...