У меня есть таблица данных с расходами по дате ряда продуктов. Я сгенерировал прогноз каждого продукта, и теперь хочу получить среднее и верхнее 80% в период +1. Проблема заключается в том, что объект прогноза представляет собой список с разными структурами, в зависимости от используемого метода, поэтому я не могу получить значения путем индексирования (я могу по именам с data.table
).извлечение из списка по имени dplyr
Это данные (фиктивный) и код:
# load required libraries
library(data.table)
library(xts)
library(forecast)
library(dplyr)
# create random data
set.seed(1)
a <- data.table(prod = sample(LETTERS[1:5], 20, TRUE), cons = sample(1:50, 20, TRUE), dt = sample(seq(as.Date("2016/06/01"), as.Date("2016/07/27"), by = "day"), 20, FALSE))
# create a time series of purchases
b <- a[, .(C=sum(cons)), by = .(dt, prod)][, x := .(list(xts(x = C, order.by = dt))), by = prod]
b <- b[, .SD[1,], by = prod]
# create a "reference" timeseries
dts <- xts(order.by = seq(as.Date("2016/06/01"), as.Date("2016/07/27"), by = "day"))
# merge reference and calculated timeseries, so zeros appear
b[, x2 := .(list(merge.xts(dts, x[[1]], fill = 0))), by = prod]
# calculate forecast for each extended timeseries
b[, fc := .(list(forecast(x2[[1]]))), by = prod]
Теперь я хочу, чтобы извлечь среднего и верхнего уровня. Проблема в том, что среднее значение иногда расположено в слоте 2 списка, а иногда нет, поэтому я должен назвать его по имени. В data.table
я:
b[, mn := fc[[1]]$mean[1], by = prod]
b[, up := fc[[1]]$upper[1,1], by = prod]
, но если я пытаюсь сделать то же самое в dplyr
, то я получаю ошибку закрытия:
b %>% mutate(mnD = .$fc[[1]]$mean[1])
## Error: invalid subscript type 'closure'
b %>% mutate(mnD = fc[[1]]$mean[1])
## Error: invalid subscript type 'closure'
Что я делаю неправильно и как я могу добиться этого в dplyr
?
Не нужно, чтобы оно правильно печаталось. Без него столбцы списка печатаются полностью (а не). Но хорошее напоминание - я отредактирую, чтобы упомянуть об этом. –