2017-10-17 6 views
0

서로 다른 장치에 대한 데이터의 일별 샘플을 사용하여 데이터 세트의 특정 열을 두 개의 키 (시간 및 인수 1)로 그룹화 된 시계열로 변환하려고 시도했습니다data.table에서 ts 함수 내에서 시작 및 끝 정의 groupby

내가 가진 데이터는 2015년 10월 1일에서 2017년 8월 1일이

  date hour factor1 volume wkday 
1: 2015-10-01  AM 11011 530 Thursday  
2: 2015-10-01  AM 11012 1535 Thursday  
3: 2015-10-01  AM 11021 191 Thursday  
4: 2015-10-01  AM 11131 1108 Thursday  
5: 2015-10-01  AM 11132 1518 Thursday  
6: 2015-10-01  AM 11141 508 Thursday  

날짜 실행 같은 것입니다, 시간이 두 가지 수준 (AM과 PM)가, 인수 1은 많은 수준을 가지고 있으며, wkday입니다 지금까지는 필요하지 않았습니다. timeseries 데이터로 변환하려는 열은 볼륨입니다.

나는이 작업을 수행하려고 :

따라서
table_11011 = table[factor1 == '11011'] 
table_11011_am = table_11011[hour == 'AM'] 

table_11011_am[, vol_ts := ts(table_11011_am[,volume], 
        start = decimal_date(table_11011_am[, date][1]), 
        frequency = 365)] 

내가 원하는 출력을 얻을하지만 모든 다른 인수 1 레벨과 시간이 요약 할 때 입력 방법을 모르겠어요 올바른 시작과 끝을에 날짜. 지금까지 나는 이것을 할 수 있었지만 나쁜 결과를주는 것으로 보인다.

table[, vol_ts := ts(volume, 
        start = decimal_date(table[, date][1]), frequency = 365), by = c('factor1', 'hour')] 

아무 도움이됩니다.

답변

1

100 %가 여기에 의도 된 사용법을 따르는 지 확실하지 않지만 비슷한 문제에 어떻게 대처할 수 있는지는 여기에 나와 있습니다.

기본적으로 seq.Date()을 사용하여 일정한 일련의 날짜를 생성 한 다음 data.table의 CJ() (교차 결합) 기능을 사용하여 시간과 요인의 각 조합에 대해 해당 시리즈를 반복 할 수 있습니다.

일단 정규 시리즈를 사용하면 원시 데이터에 가입하여 정기적으로 간격을 둔 데이터를 얻을 수 있습니다. 항상 R의 특수 시계열 유형 객체를 처리 한 적이 없으며 항상 data.table, zooRcppRoll 패키지로 필요한 모든 작업을 수행 할 수있었습니다.

희망 사항이 도움이 될 수 있습니다.

library(data.table) 

DT <- data.table(Date = as.Date(c("2015-10-01","2015-10-25","2015-11-04","2015-11-06")), 
       hour = c("AM","PM","AM","PM"), 
       factor1 = c("A","B","C","D"), 
       volume = c(1,2,3,4)) 

## Create a regular sequence of all dates in range 
## with a row for each combo of hour and factor1 
TS <- CJ(Date = seq.Date(from = DT[,min(Date)], to = DT[,max(Date)],by = "day"), 
     hour = DT[,unique(hour)], 
     factor1 = DT[,unique(factor1)]) 

## Join the data to this expanded time series 

setkey(DT,Date,hour,factor1) 
setkey(TS,Date,hour,factor1) 

TS <- DT[TS] 

## Fill with zeros if necessary 
TS[is.na(volume), volume := 0] 

## If you want a separate column for factor level 
Wide <- dcast(TS, ... ~ factor1, value.var = "volume") 

## Or if you want a column (time series) for each combo 
VeryWide <- dcast(TS, ... ~ factor1 + hour, value.var = "volume") 
+0

이것은 정확히 내가 찾던 답변이 아니지만 매우 도움이되었습니다. 내가 찾고있는 것은 동일한 데이터 프레임 내에서 어떤 방법으로 새로운 칼럼에 TS를 정의하는 것이지만 각각의 factor1과 시간이 다른 길이를 가질 수 있기 때문에 각 TS는 다릅니다 ... 나는 ' 나 자신을 설명하고있다. 어쨌든, 도와 주셔서 대단히 감사합니다. –