【问题标题】:extracting from list by name with dplyr使用 dplyr 按名称从列表中提取
【发布时间】:2016-07-28 22:43:31
【问题描述】:

我有一个数据表,其中包含许多产品的按日期消费。我生成了每个产品的预测,现在想要在 +1 期获得平均值和上 80%。问题是预测对象是一个具有不同结构的列表,具体取决于所使用的方法,因此我无法通过索引检索值(我可以通过名称使用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]

现在我想提取均值和上层。问题是平均 sometimes 位于列表的插槽 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 中实现这一点?

【问题讨论】:

    标签: r data.table dplyr forecasting


    【解决方案1】:

    purrr 包中的map_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
    

    除此之外,as_data_frame() 不是必需的,而是添加以简洁地打印结果。没有它,列表列会打印所有数据。

    【讨论】:

    • 不需要,只要打印正确即可。没有它,列表列将完整打印(而不是 )。但很好的提醒 - 我会编辑提及这一点。
    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多