2014-06-12 3 views
0

가정하자 내가 가진이 data.table :날짜를 확장 data.table 조작

library(data.table) 
data <- data.table(Event = c("P_2800 Back","Holiday_PRE","Holiday","Holiday_POST","P_100 Back","Holiday_PRE","Holiday","Holiday_POST", "P_100 Back"), Event_From=c("25/03/2010","11/04/2010","12/04/2010" ,"15/04/2010","02/05/2010", "11/04/2011","12/04/2011" ,"15/04/2011","02/05/2011"), Event_Pre=c(NA,NA,NA,NA,1,NA,NA,NA,1), Event_Post=c(NA, NA, NA,NA,2, NA, NA,NA,2), Event_To=c("25/03/2010","11/04/2010","14/04/2010" ,"15/04/2010","02/05/2010","11/04/2011","14/04/2011" ,"15/04/2011","02/05/2011"), Holiday=c(F,F,T,F,F,F,T,F,F)) 

반환,

  Event Event_From Event_Pre Event_Post Event_To Holiday 
1: P_2800 Back 25/03/2010   NA  NA 25/03/2010 FALSE 
2: Holiday_PRE 11/04/2010   NA  NA 11/04/2010 FALSE 
3:  Holiday 12/04/2010   NA  NA 14/04/2010 TRUE 
4: Holiday_POST 15/04/2010   NA  NA 15/04/2010 FALSE 
5: P_100 Back 02/05/2010   1   2 02/05/2010 FALSE 
6: Holiday_PRE 11/04/2011   NA  NA 11/04/2011 FALSE 
7:  Holiday 12/04/2011   NA  NA 14/04/2011 TRUE 
8: Holiday_POST 15/04/2011   NA  NA 15/04/2011 FALSE 
9: P_100 Back 02/05/2011   1   2 02/05/2011 FALSE 
나는 포함하는 원래의 날짜 열을 확장하고자하는

  1. Event_FromEvent_To 열에있는 날짜 사이의 날짜. N이 예제 Event_Post에서 열 Event_Pre미터의 값은 (이벤트를 위해, P_100 위로이다 열 Event_From의 날짜 이전

  2. N 날짜 날짜 Event_To미터 다음 결과는 최종 결과가 있어야 2010년 1월 5일 및 2010년 4월 5일 간의 기간)

같아야

Event    Date   Holiday 
P_2800 Back  25/03/2010 FALSE 
Holiday_PRE  11/04/2010 FALSE 
Holiday   12/04/2010 TRUE 
Holiday   13/04/2010 TRUE 
Holiday   14/04/2010 TRUE 
Holiday_POST  15/04/2010 FALSE 
P_100 Back  01/05/2010 FALSE 
P_100 Back  02/05/2010 FALSE 
P_100 Back  03/05/2010 FALSE 
P_100 Back  04/05/2010 FALSE 
Holiday_PRE  11/04/2011 FALSE 
Holiday   12/04/2011 TRUE 
Holiday   13/04/2011 TRUE 
Holiday   14/04/2011 TRUE 
Holiday_POST  15/04/2011 FALSE 
P_100 Back  01/05/2011 FALSE 
P_100 Back  02/05/2011 FALSE 
P_100 Back  03/05/2011 FALSE 
P_100 Back  04/05/2011 FALSE 

이 데이터 테이블을 조작하는 것에 대한 제안 사항을 보내 주시겠습니까?

는 당신에게 당신의 일에 대한

답변

2
# Let's get rid of those pesky NA's 
data[is.na(Event_Post), Event_Post := 0] 
data[is.na(Event_Pre), Event_Pre := 0] 

# Not much left, construct the final result 
data[, list(Date = seq(as.Date(Event_From, format="%d/%m/%Y") - Event_Post, 
         as.Date(Event_To, format="%d/%m/%Y") + Event_Pre, 
         by = 1), 
      Holiday), 
     by = list(Event, Event_From)][, !"Event_From", with = FALSE] 
#   Event  Date Holiday 
# 1: P_2800 Back 2010-03-25 FALSE 
# 2: Holiday_PRE 2010-04-11 FALSE 
# 3:  Holiday 2010-04-12 TRUE 
# 4:  Holiday 2010-04-13 TRUE 
# 5:  Holiday 2010-04-14 TRUE 
# 6: Holiday_POST 2010-04-15 FALSE 
# 7: P_100 Back 2010-04-30 FALSE 
# 8: P_100 Back 2010-05-01 FALSE 
# 9: P_100 Back 2010-05-02 FALSE 
#10: P_100 Back 2010-05-03 FALSE 
#11: Holiday_PRE 2011-04-11 FALSE 
#12:  Holiday 2011-04-12 TRUE 
#13:  Holiday 2011-04-13 TRUE 
#14:  Holiday 2011-04-14 TRUE 
#15: Holiday_POST 2011-04-15 FALSE 
#16: P_100 Back 2011-04-30 FALSE 
#17: P_100 Back 2011-05-01 FALSE 
#18: P_100 Back 2011-05-02 FALSE 
#19: P_100 Back 2011-05-03 FALSE 
+0

감사 감사하지만, 우리가 예를 들어 2011 년에 같은 휴가를 중복 이벤트가있는 경우, 아래 코드는 오류 발생 : seq.Date에서'오류 (as.Date를 (Event_From, 형식 = "% d/% m/% Y") - Event_Post, : 'from'길이가 1이어야 함 '이 문제를 반영하도록 OP를 수정했습니다. – newbie

+0

@newbie 위의 상황에서 간단히'Event' 대신'list (Event, Event_From)'로 그룹화하면됩니다 - edit – eddi