2012-10-03 4 views
0

데이터 프레임에 2 개의 날짜 변수 WK_BEGIN_DT & WK_END_DT가 있습니다 (예 : DAT). 둘 다 문자 형식입니다. 나는 다음과 같은 것을 얻으려고 노력하고있다. 내가 여기에 SAS 명령을 사용하지만, R의 일 변환

내 데이터는 다음과 같습니다 R.

에서 동일한 작업을 수행 할 해요 :

var1 Begin_DT  End_DT 
1 02/07/2012 02/11/2012 
2 04/09/2012 04/15/2012 
3 04/17/2012 04/23/2012 
4 06/21/2012 06/30/2012 
5 07/15/2012 07/29/2012 

SAS 코드 : 1 부 문제에 대한

DATA DAT; 
    set DAT; 
## PART 1: ## 

    WK_BEGIN_DT = BEGIN_DT - 2 ; 
    WK_END_DT = WK_BEGIN_DT + 6 ; 

## PART 2: ## 

    if WEEKDAY(WK_END_DT) ^= 6 then do ; 
    if weekday(WK_END_DT) = 7 then WK_END_DT = WK_END_DT + 6 ; 
     else WK_END_DT = WK_END_DT + 6 - weekday(WK_END_DT) ; 
    end ; 

, 내가 계산 한 후

DAT$new.dt <- DAT$wk_end_dt - as.difftime(2, unit="days") 

을 시도, 결과는 같아야합니다 :

,691

Error in `$<-.data.frame`(`*tmp*`, "new.dt", value = numeric(0)) : 
    replacement has 0 rows, data has 2354 

이 사람이 어떻게 PART 1 & 2 부 모두에 대한 결과를 얻을 수 있도록 도와 주시겠습니까 :

var1 Begin_DT  End_DT  Wk_Begin_DT WK_END_DT 
1 02/07/2012 02/11/2012 02/05/2012 02/12/2012 
2 04/09/2012 04/15/2012 04/07/2012 04/15/2012 
3 04/17/2012 04/23/2012 04/15/2012 04/23/2012 
4 06/21/2012 06/30/2012 06/19/2012 06/25/2012 
5 07/15/2012 07/29/2012 07/13/2012 07/21/2012 

그러나 다음과 같은 오류를 보여?

감사합니다. 감사합니다,

+0

데이터를 수정하거나 몇 가지 예제 데이터를 게시하십시오. – Maiasaura

+0

'DAT $ wk_end_dt'를 날짜 - 시간 분류 변수로 만들어야합니다. 나는 아직 그것이라고 생각하지 않는다. ? strptime 및? format.POSIXct를 읽습니다. –

+0

귀하의 의견에 감사드립니다. 나는 strptime을 시도했다. (DAT $ end_dt, "% m/% d/% Y"). 그것은 변환 중입니다. 하지만 계산은하지 않습니다. 처음에는 as.Date (DAT $ end_dt, "% m/% d/% Y")와 같은 작업을 수행했습니다. 그런 다음 나는 strptime과 같은 결과를 얻고있었습니다. 나는 또한 POSIXct를 시도했다. 게시물을 통해 아이디어를 얻었습니다. http://stackoverflow.com/questions/2254986/how-to-subtract-days-in-r – Beta

답변

2
df <- read.table(textConnection("var1 Begin_DT  End_DT 
1 02/07/2012 02/11/2012 
2 04/09/2012 04/15/2012 
3 04/17/2012 04/23/2012 
4 06/21/2012 06/30/2012 
5 07/15/2012 07/29/2012"), header = T) 

# Then typecast your dates to a date format 
df$Begin_DT <- as.Date(strptime(df$Begin_DT, "%m/%d/%Y")) 
df$End_DT <- as.Date(strptime(df$End_DT, "%m/%d/%Y")) 

df$Week_begin <- df$Begin_DT - 2 
df$Week_end <- df$Week_begin + 6 

library(plyr) 
library(lubridate) 
# If you dont have these packages, 
# run install.packages('plyr') and install.packages('lubridate') 
ddply(df, .(Week_end), function(x) { 
    if(day(x$Week_end) !=6 && day(x$Week_end) == 7) { 
       x$Week_end <- x$Week_end + 6 
      } else { 
       x$Week_end <- x$Week_end + 6 - wday(x$Week_end) 
      } 
    x 
    }) 
+0

그것은 매력처럼 작동했습니다. 고마워요. 마이아 우아! 너 정말 대단해! – Beta