2010-12-06 1 views
2

다음 함수는 작동하지만 마지막 as.Date 부분은 다소 이해가 안되는 시행 착오의 결과입니다. ifelse를 사용한 후 as.Date origin을 다시 설정해야하는 이유는 무엇입니까? 더 좋은 방법이 있습니까?

### This function creates a real date column out of year/period that is saved in 
### in separate columns, plus it handles a 13th period in case of overlapping period 
### terminology. Turns quarters into months. 

realDate <- function (table,year="year_col",period="period_col"){ 


if (is.character(table) == TRUE) 
{ 
    dframe <- get(table) 
} 

else{ 
    dframe <- table 
} 


x <- expression({resDate <- with(dframe, 
        as.Date(paste(get(year),"-", 
            ifelse(get(period) > 9, get(period), 
              paste("0", get(period), sep = "")), 
            "-01", sep = ""))) 
     }) 

y <- expression({resDate <- with(dframe,as.Date(paste(get(year) + 1,"-","01","-01",sep="")))}) 

#### I do not get this? Why do I have to do this? 
a <- ifelse(get(period) == 13,eval(y),eval(x)) 
a <-as.Date(a, origin="1970-01-01") 


return(a) 

} 

대신 나는 (더 직관적으로 나에게했기 때문에) 이런 식으로 작업을 수행하려고 : 조건이 (NO) FALSE했다 때마다

{ .... 
ifelse(get(period) == 13,eval(y),eval(x)) 
return(resDate) 
} 

이것은 수정 된 값을 반환하지만 경우 NA를 반환 조건은 TRUE (예)입니다. 왜 그런가요? 그리고 위의 함수를 사용하면 왜 다시 원점을 정의해야합니까? 왜 나 한테 전화 했어? 데이트?

편집 :

a <- rep(2002:2010,2) 
b <- rep(1:13,2) 
d<-cbind(a,b[1:length(a)]) 
names(d) <- c("year_col","period_col") 

P.S : 나는 벡터화 ifelse에 thread을 발견했다.

+0

몇 가지를 시도 좋을 것이다 입력에 대한 아이디어를 제공합니다. –

+0

xx <-eval (x); yy <-eval (y); ifelse (get (마침표) == 13, yy, xx)'가 올바르게 작동합니까? – Marek

+0

죄송합니다. 내 게시물을 편집하면 두 개의 열이있는 한 data.frame d에 모든 정보를 바인딩 할 수 있습니다. –

답변

2

당신의 구성은 적어도 "재미있다". 시작하려면 x 나 y가 출력하지 않습니다. 왜 당신이 eval()에 과제를 사용하는지 궁금합니다. 마지막 호출이 정확히 무엇인지 resDate 벡터를 제공합니다. 그리고 그것은 조건에 좌우되지 않습니다. 마지막으로 작성된 것입니다 (귀하의 경우 eval(x)). ifelse 절이 실행되기 전에 실행됩니다.

또한 출력은 데이터 개체가 아닌 데이터의 숫자 표현입니다. 그건 resDate에 있습니다. 제 생각 엔 ifelseeval()을 사용할 때 출력 벡터의 클래스를 결정할 수 없습니다. 나는 당신이 실제로 출력물을 얻는 것에 놀랐다. 사실 R에서 "버그"라고 불릴 수있는 것을 효과적으로 사용하고있다.

귀하의 실수는 귀하의 실수입니다 : get(period)는 존재하지 않습니다. get(period, dframe)이어야합니다. 그런 다음 작동합니다. 컴퓨터에서 작동하는 유일한 이유는 아마도 period이 작업 공간에 있기 때문입니다. 디버깅 할 때 Classis 문제.

어떤 경우

, 나는 그것을 만들 것입니다 :

realDate <- function (table,year="year_col",period="period_col"){ 
    if (is.character(table)){ # is.character(table) returns a boolean already. 
     dframe <- get(table) 
    } else { 
     dframe <- table 
    } 
    year <- get(year,dframe) 
    period <- get(period,dframe) 

    year[period==13] <- year[period==13]+1 
    period[period==13] <- 1 

    as.Date(paste(year,"-",period,"-01",sep="")) 
} 

이 꽤 빨리 자신보다 덜 함정과 전환을 가지고 있으며, 더 그 일의 R의 방법입니다. ifelse 구문으로 연도 [...]와 마침표 [...]를 바꿀 수 있지만 인덱스를 사용하는 것이 일반적으로 빠릅니다.


편집 :

이 데이터 생성을위한 쉽습니다 :

dframe <- data.frame(
    year_col= rep(2006:2007,each=13), 
    period_col = rep(1:13,2) 
) 

realDate(dframe) 
[1] "2006-01-01" "2006-02-01" "2006-03-01" "2006-04-01" "2006-05-01" 
      "2006-06-01" "2006-07-01" "2006-08-01" "2006-09-01" 
[10] "2006-10-01" "2006-11-01" "2006-12-01" "2007-01-01" "2007-01-01" 
      "2007-02-01" "2007-03-01" "2007-04-01" "2007-05-01" 
[19] "2007-06-01" "2007-07-01" "2007-08-01" "2007-09-01" 
      "2007-10-01" "2007-11-01" "2007-12-01" "2008-01-01" 
+0

이상한, 성가신, stoopid ... 그것을 당신이 선택할 수 있습니다 전화 주시기 바랍니다. 비록 내가 많이 배웠기 때문에 재미있는 것도 적용된다.). R, Thx에서 색인을 생성 할 수있는 것은 cols뿐 아니라 고전적인 디버깅 실수를 지적하는 것뿐 아니라 당연히 바로 그 점을 잊어 버리는 경향이 있습니다. 아, 그리고 그게 너무 좋았어. 너는 내 날을 만들어 줬어. 그 조건에 정말로 중대한 문제가있었습니다 ... 왜 dframe 없이는 (기간) 얻지 못합니까? –

+1

@ ran2 : dframe $ period_col 대신 작업 영역에서 period_col을 호출하는 것과 같습니다. –

+1

+ as.Date()를 사용할 때 선행 0을 마침표로 사용할 필요가 없다는 점을 지적하고자합니다. –

관련 문제