Мы можем использовать другую группу by=
и назначать переменные с помощью :=
. .N
- это специальный символ, содержащий количество строк в группе.
library(data.table)
setDT(Data)[,hour.trans := .N, by = c("machine","date","hour")][
,daily.avg := .N / 24,by = c("machine","date")][
,difference := hour.trans - daily.avg, by = c("machine","date")][
,.(machine,date,hour,daily.avg,difference)]
# machine date hour daily.avg difference
# 1: 179 2017-01-11 15 0.08333333 1.9166667
# 2: 179 2017-01-11 15 0.08333333 1.9166667
# 3: 179 2017-01-28 0 0.04166667 0.9583333
# 4: 179 2017-02-04 2 0.04166667 0.9583333
# 5: 179 2017-03-03 6 0.04166667 0.9583333
# 6: 2707 2017-04-01 17 0.08333333 0.9166667
# 7: 2707 2017-04-01 7 0.08333333 0.9166667
# 8: 2709 2017-02-19 0 0.04166667 0.9583333
# 9: 2709 2017-03-19 7 0.04166667 0.9583333
#10: 2709 2017-03-29 5 0.04166667 0.9583333
Данные
structure(list(price = c(3.1, 3.1, 3.1, 3.1, 3.1, 2.3, 2.3, 2.3,
2.3, 2.3), machine = c(179L, 179L, 179L, 179L, 179L, 2707L, 2707L,
2709L, 2709L, 2709L), timestamp = structure(c(2L, 1L, 3L, 4L,
6L, 10L, 9L, 5L, 7L, 8L), .Label = c("2017-01-11 15:53:45", "2017-01-11 15:53:58",
"2017-01-28 00:31:20", "2017-02-04 02:08:42", "2017-02-19 00:28:08",
"2017-03-03 06:34:04", "2017-03-19 07:34:21", "2017-03-29 05:56:19",
"2017-04-01 07:55:11", "2017-04-01 17:06:42"), class = "factor"),
date = structure(c(1L, 1L, 2L, 3L, 5L, 8L, 8L, 4L, 6L, 7L
), .Label = c("2017-01-11", "2017-01-28", "2017-02-04", "2017-02-19",
"2017-03-03", "2017-03-19", "2017-03-29", "2017-04-01"), class = "factor"),
hour = c(15L, 15L, 0L, 2L, 6L, 17L, 7L, 0L, 7L, 5L), weekday = structure(c(4L,
4L, 2L, 2L, 1L, 2L, 2L, 3L, 3L, 4L), .Label = c("Friday",
"Saturday", "Sunday", "Wednesday"), class = "factor"), month = c(1L,
1L, 1L, 2L, 3L, 4L, 4L, 2L, 3L, 3L), year = c(2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L),
trans_id = structure(c(2L, 1L, 3L, 4L, 6L, 10L, 9L, 5L, 7L,
8L), .Label = c("2017-01-11 15:53:45,179", "2017-01-11 15:53:58,179",
"2017-01-28 00:31:20,179", "2017-02-04 02:08:42,179", "2017-02-19 00:28:08,2709",
"2017-03-03 06:34:04,179", "2017-03-19 07:34:21,2709", "2017-03-29 05:56:19,2709",
"2017-04-01 07:55:11,2707", "2017-04-01 17:06:42,2707"), class = "factor")), class = "data.frame", row.names = c(NA,
-10L))