2013-10-25 14 views
0

기본 결과 측정 값 (Y)과 공변량 (X1)에 해당하는 여러 개인 (ID)의 날짜와 시간이 있습니다.여러 행에 걸쳐 날짜를 비교하고 조건이 일치하면 값을 바꿉니다.

내 목적은 측정이 X1Y 변수 측정 된 날짜/시간에서 +/- 24 시간 이내에 기록 된 경우 Y 행마다 X1 측값 대체하는 것이다. 구상이 쉽게 확인 (및 R로로드), 여기 데이터가 현재 배치되는 방식이다

structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), TIME = structure(1:15, .Label = c("01/01/2013 12:01", 
"01/03/2013 08:49", "01/03/2013 20:52", "02/01/2013 05:00", "02/03/2013 05:30", 
"02/03/2013 21:14", "02/05/2013 05:15", "02/12/2013 05:03", "02/15/2013 04:16", 
"02/16/2013 04:12", "02/16/2013 21:02", "03/01/2010 17:58", "03/02/2010 00:10", 
"03/03/2010 10:45", "03/04/2010 09:00"), class = "factor"), Y = structure(c(1L, 
5L, 7L, 1L, 1L, 2L, 1L, 1L, 1L, 4L, 3L, 1L, 8L, 1L, 6L), .Label = c(".", 
"22", "35", "4", "5", "6", "8", "9"), class = "factor"), X1 = structure(c(2L, 
1L, 1L, 7L, 7L, 1L, 4L, 4L, 3L, 1L, 1L, 6L, 1L, 5L, 1L), .Label = c(".", 
"0.1", "0.2", "0.4", "0.6", "0.9", "1.0"), class = "factor")), .Names = c("ID", 
"TIME", "Y", "X1"), class = "data.frame", row.names = c(NA, -15L)) 

원하는 출력을 단순화하기 위해, I가 아닌 경우에만 누락 Y 값의 행을 표시하고 싶다 이러한 최종 생성물은 다음과 같을 것이다 :

ID    TIME Y X1 
1 1 01/03/2013 08:49 5 . 
2 1 01/03/2013 20:52 8 . 
3 2 02/03/2013 21:14 22 . 
4 2 02/16/2013 04:12 4 0.2 
5 2 02/16/2013 21:02 35 . 
6 3 03/02/2010 00:10 9 0.9 
7 3 03/04/2010 09:00 6 0.6 

은 (1) 복수의 행에 걸쳐 반복하고 X1Y 측정치와의 차이를 얻기 위해 24 시간의 절대 값을 평가하는 것이 가능하다 (2) 누락 된 값 X1을 t 내에있는 값으로 바꿉니다. 그 +/- 24 시간 창?

이 문제를 해결하는 방법에 대한 의견은 크게 부탁드립니다.

+0

누락 된 'X1'이 (가) 24 시간 이내에 하나 이상의 'X1'값이 있으면 어떻게됩니까? –

+0

게시물에 [재현 가능한 코드 예제] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)를 추가하는 것이 좋습니다. 이라고 밝혔다. –

+0

출력의 세 번째 줄에있는 0.2는 어디에서 오는가? – TheComeOnMan

답변

0

데이터를 xts으로 변환하면 xts의 쉬운 하위 설정 기능을 사용하여 원하는 것을 얻을 수 있습니다.

PS : Y 측정 값이 24 시간 이내에 정확히 1의 값을 가진 경우 다음 코드가 작동합니다.

require(xts) 
xx <- xts(DF[, c(1, 4, 5)], as.POSIXct(paste0(DF$Date, " ", DF$TIME), format = "%m/%d/%Y %H:%M")) 


sapply(index(xx[!is.na(xx$Y)]), FUN = function(tt) { 
    startTime <- tt - 24 * 60 * 60 
    endTime <- tt + 24 * 60 * 60 
    y <- xx[paste(startTime, endTime, sep = "/")] 
    if (nrow(y[!is.na(y$X1), "X1"]) != 0) { 
     return(as.vector(y[!is.na(y$X1), "X1"])) 
    } else { 
     return(NA) 
    } 

}) 
## [1] 0.9 0.6 NA NA 1.0 0.2 NA 


xx[!is.na(xx$Y), "X1"] <- sapply(index(xx[!is.na(xx$Y)]), FUN = function(tt) { 
    startTime <- tt - 24 * 60 * 60 
    endTime <- tt + 24 * 60 * 60 
    y <- xx[paste(startTime, endTime, sep = "/")] 
    if (nrow(y[!is.na(y$X1), "X1"]) != 0) { 
     return(as.vector(y[!is.na(y$X1), "X1"])) 
    } else { 
     return(NA) 
    } 

}) 

xx[!is.na(xx$Y), "X1"] 
##      X1 
## 2010-03-02 00:10:00 0.9 
## 2010-03-04 09:00:00 0.6 
## 2013-01-03 08:49:00 NA 
## 2013-01-03 20:52:00 NA 
## 2013-02-03 21:14:00 1.0 
## 2013-02-16 04:12:00 0.2 
## 2013-02-16 21:02:00 NA 
+0

이것은 정말 좋아 보인다 - 고마워요! 마지막 단계에서 누락 된 Y 값을 제거하려고하면 다음 오류가 발생합니다. 'xx [! is (nx $ Y), "X1"] : 치수의 수가 잘못되었습니다. In is.na (xx $ Y) : is.na()는 'NULL'타입의 비 (리스트 또는 벡터)에 적용됩니다. 당신의 결과를 어떻게 복제 할 수 있는지 알고 싶습니까? 감사! – Entropy

관련 문제