2013-11-26 4 views
3

관측 세트의 경우 응답 이벤트 날짜가 있습니다.어떤 값이 범위에 있는지 확인하십시오.

structure(list(Date1_P2 = structure(c(14061, 14944, 14944), class = "Date"), 
    Date2_P2 = structure(c(NA, 11566, 11747), class = "Date"), 
    Date3_P2 = structure(c(NA, 10408, 11627), class = "Date"), 
    Date4_P2 = structure(c(NA, 8370, 11566), class = "Date")), .Names = c("Date1_P2", 
"Date2_P2", "Date3_P2", "Date4_P2"), row.names = c(NA, 3L), class = "data.frame") 
> dates 
    Date1_P2 Date2_P2 Date3_P2 Date4_P2 
1 2008-07-01  <NA>  <NA>  <NA> 
2 2010-12-01 2001-09-01 1998-07-01 1992-12-01 
3 2010-12-01 2002-03-01 2001-11-01 2001-09-01 

나는이 날짜 중 하나가 트리거 이벤트의 범위 내에있는 경우 TRUE있는 변수를 만들려고합니다. 2001 년 9 월에 관측치가 반응했거나 예상 할 수있는 일이 일어났습니다. I는 다음과 같은 기능, 이벤트의 양측 180 일 이내에 응답이있는 경우

checkmove <- function(event, range, moves){ 
    moves <- as.numeric(moves) 
    early <- as.numeric(event - range) 
    late <- as.numeric(event + range) 
    moved <- any(moves > early & moves < late, na.rm=TRUE) 
    return(moved) 
} 

쓸 한 값 TRUE이어야한다. 이 함수는 한 줄씩 작동하지만 전체 테이블에서 작동하도록 할 수는 없습니다.

# This is right 
> checkmove(as.Date("2001-09-01"), 180, dates[1,]) 
[1] FALSE 
> checkmove(as.Date("2001-09-01"), 180, dates[2,]) 
[1] TRUE 
> checkmove(as.Date("2001-09-01"), 180, dates[3,]) 
[1] TRUE 
# This is wrong 
> apply(dates, 1, function(x) checkmove(as.Date("2001-09-01"), 180, x)) 
    1  2  3 
FALSE FALSE FALSE 
Warning messages: 
1: In checkmove(as.Date("2001-09-01"), 180, x) : 
    NAs introduced by coercion 
2: In checkmove(as.Date("2001-09-01"), 180, x) : 
    NAs introduced by coercion 
3: In checkmove(as.Date("2001-09-01"), 180, x) : 
    NAs introduced by coercion 

맞음 apply 기능을 사용하고 있지 않습니까? 루프를 for 회피하는 것이 좋습니다. 이것을 시작하는 더 좋은 방법이 있습니까?

답변

3

예, apply은 데이터 프레임 datesmatrix으로 강제 변환합니다. 값은 더 이상 클래스 date이 아니라 character입니다. 그러므로 as.numeric은 "not"작동합니다 (강제로 도입 된 NA).

> dates 
    Date1_P2 Date2_P2 Date3_P2 Date4_P2 
1 2008-07-01  <NA>  <NA>  <NA> 
2 2010-12-01 2001-09-01 1998-07-01 1992-12-01 
3 2010-12-01 2002-03-01 2001-11-01 2001-09-01 
> apply(dates, 1, function(x) class(x)) 
      1   2   3 
"character" "character" "character" 

plyr에 "ddply"패밀리를 사용해보십시오. 예 :

> library(plyr) 
> aaply(dates, 1, function(x) checkmove(as.Date("2001-09-01"), 180, x), .expand=F) 
    1  2  3 
FALSE TRUE TRUE 
+0

우수. 'base'와'plyr' apply 함수 사이의 분열은 R에서 가장 큰 장애물 중 하나라고 느낍니다. – gregmacfarlane

+0

@gmacfarlane plyr 함수는 (특히 입력/출력 데이터 유형에 여러 가지 선택 사항을 제공하기 위해)보다 "사용자 친화적"입니다. . "기본"솔루션이 필요하다면 : 1) for 루프, 2) 'apply'이전의 숫자로의 변환, 3) 날짜로의 변환, 'apply'내부의 숫자로의 변환 (이것은 느려지지만 여전히 유효한 옵션) – Michele

관련 문제