使用dplyr按名称从列表中提取

使用dplyr按名称从列表中提取,r,data.table,dplyr,forecasting,R,Data.table,Dplyr,Forecasting,我有一个数据表,按日期列出了许多产品的消耗量。我生成了每个产品的预测,现在想得到周期+1的平均值和上限80%。问题是forecast对象是一个具有不同结构的列表,这取决于所使用的方法,因此我无法通过索引检索值(我可以使用data.table按名称检索) 这是(虚拟)数据和代码: # load required libraries library(data.table) library(xts) library(forecast) library(dplyr) # create random d

我有一个数据表,按日期列出了许多产品的消耗量。我生成了每个产品的预测,现在想得到周期+1的平均值和上限80%。问题是forecast对象是一个具有不同结构的列表,这取决于所使用的方法,因此我无法通过索引检索值(我可以使用
data.table
按名称检索)

这是(虚拟)数据和代码:

# 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]
但如果我尝试在
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
中实现这一点?

purr
包中的
map\u dbl()
相结合将按如下方式工作:

library(dplyr)
library(purrr)
b %>% as_data_frame() %>% mutate(mnD = map_dbl(fc, ~ .$mean[1]))
#> # A tibble: 5 x 7
#>    prod         dt     C         x        x2             fc       mnD
#>   <chr>     <date> <int>    <list>    <list>         <list>     <dbl>
#> 1     B 2016-07-17    47 <S3: xts> <S3: xts> <S3: forecast> 2.5241999
#> 2     C 2016-07-14    33 <S3: xts> <S3: xts> <S3: forecast> 1.1749266
#> 3     E 2016-06-30     7 <S3: xts> <S3: xts> <S3: forecast> 0.5952119
#> 4     D 2016-06-24    20 <S3: xts> <S3: xts> <S3: forecast> 3.3695962
#> 5     A 2016-07-04    18 <S3: xts> <S3: xts> <S3: forecast> 0.8421001
库(dplyr)
图书馆(purrr)
b%>%作为\u data\u frame()%>%变异(mnD=map\u dbl(fc,~.$mean[1]))
#>#A tibble:5 x 7
#>产品dt C x x2 fc mnD
#>                               
#>1B 2016-07-17 47 2.5241999
#>2 C 2016-07-1433 1.1749266
#>3 E 2016-06-30 7 0.5952119
#>4 D 2016-06-2420 3.3695962
#>5A 2016-07-0418 0.8421001

除此之外,
as\u data\u frame()
不是必需的,而是添加到以整洁的方式打印结果中。如果没有它,列表列将打印所有数据。

无需打印,只需正确打印即可。如果没有它,列表列将全部打印(而不是打印)。但很好的提醒-我会编辑提及这一点。
library(dplyr)
library(purrr)
b %>% as_data_frame() %>% mutate(mnD = map_dbl(fc, ~ .$mean[1]))
#> # A tibble: 5 x 7
#>    prod         dt     C         x        x2             fc       mnD
#>   <chr>     <date> <int>    <list>    <list>         <list>     <dbl>
#> 1     B 2016-07-17    47 <S3: xts> <S3: xts> <S3: forecast> 2.5241999
#> 2     C 2016-07-14    33 <S3: xts> <S3: xts> <S3: forecast> 1.1749266
#> 3     E 2016-06-30     7 <S3: xts> <S3: xts> <S3: forecast> 0.5952119
#> 4     D 2016-06-24    20 <S3: xts> <S3: xts> <S3: forecast> 3.3695962
#> 5     A 2016-07-04    18 <S3: xts> <S3: xts> <S3: forecast> 0.8421001