2016-07-28 6 views
3

私は数多くの製品の日付で消耗しているデータテーブルを持っています。私は各製品の予測を生成し、現在では期間+1で平均と上位80%を得たいと考えています。問題は、予測オブジェクトは、使用するメソッドによって構造が異なるリストであるため、索引付けで値を取得できません(名前は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に位置していることがあり、時にはそうではないので、名前で呼ぶ必要があるということです。

b[, mn := fc[[1]]$mean[1], by = prod] 
b[, up := fc[[1]]$upper[1,1], by = prod] 

が、私はdplyrで同じことをしようとすると、私は閉鎖エラーが発生します:data.tableで、私はやる

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でこれを達成することができますか?次のようにpurrrパッケージからmap_dbl()との組み合わせ

答えて

5

が動作します:

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()が必要ですが、きちんとした方法で結果を印刷するために追加されません。それがなければ、リストの列はすべてのデータを印刷します。

+2

これは必要ありません。正しく印刷されます。それがなければ、リスト列は完全に印刷されます(ではなく)。しかし、良い思い出 - 私はこれを言及するために編集します。 –

関連する問題