2016-07-28 3 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

필요가 없습니다. 올바르게 인쇄됩니다. 이를 사용하지 않으면 목록 열이 전체로 인쇄됩니다 ( 대신). 그러나 좋은 알림 - 나는 이것을 언급하기 위해 편집 할 것이다. –