2013-03-29 4 views
2

나는 시퀀스를 식별하고 시퀀스의 지속 시간을 분 단위로 계산하는 함수를 사용하고 있습니다. I는 최종 단계에서 데이터 결과 cbind 때, 시간은 반환 아직 이웃하는 컬럼cbind가 특정 열에서 NA를 반환하는 함수

d<-read.table(text='Date.Time Aerial 
794 "2012-10-01 08:18:00"  1 
795 "2012-10-01 08:34:00"  1 
796 "2012-10-01 08:39:00"  1 
797 "2012-10-01 08:42:00"  1 
798 "2012-10-01 08:48:00"  1 
799 "2012-10-01 08:54:00"  1 
800 "2012-10-01 08:58:00"  1 
801 "2012-10-01 09:04:00"  1 
802 "2012-10-01 09:05:00"  1 
803 "2012-10-01 09:11:00"  1 
1576 "2012-10-01 09:17:00"  2 
1577 "2012-10-01 09:18:00"  2 
804 "2012-10-01 09:19:00"  1 
805 "2012-10-01 09:20:00"  1 
1580 "2012-10-01 09:21:00"  2 
1581 "2012-10-01 09:23:00"  2 
806 "2012-10-01 09:25:00"  1 
807 "2012-10-01 09:32:00"  1 
808 "2012-10-01 09:37:00"  1 
809 "2012-10-01 09:43:00"  1', header=TRUE, stringsAsFactors=FALSE, row.names=1) 
#Give correct data type 
d$Aerial<- as.numeric(d$Aerial) 
d$Date.Time<- as.POSIXct(d$Date.Time) 

함수 (공중 2 반복 서열을 확인 'NA'보다는 그 열의 원래의 값으로 리턴 그리고 순서의 듀레이션) :

fun1 <- function(data,aerial){ 
    data_above <- 1L*(data$Aerial == aerial) 
    id_start <- paste(data$Date.Time[which(diff(c(0L,data_above))==1)]) 
    id_end <- paste(data$Date.Time[which(diff(c(data_above,0L))== -1)]) 
    res <- cbind(data[id_start,1:1],Duration=difftime(id_end,id_start, units='mins')) 
    return(res) 
} 
fun1(d,2) 

결과 :

 Duration 
[1,] NA  1 
[2,] NA  2 

기간이 올바른지, 그러나 나는 데이터를 반환하는 데하고자하는 관련 컬럼에 있어야합니다 :

 Date.Time      Duration 
[1,] 2012-10-01 09:11:00   1 
[2,] 2012-10-01 09:21:00   2 

내 실제 data.frame 많은 열보다는 Date.Time이 있고 아직도 내가 이런 식으로 할 거라고 이러한

답변

2

의 모든 NA를 반환

fun1 <- function(data,aerial) { 
    data_above <- 1L * (data$Aerial == aerial) 
    id_start <- data$Date.Time[which(diff(c(0L,data_above)) == 1)] 
    id_end <- data$Date.Time[which(diff(c(data_above, 0L)) == -1)] 
    res <- cbind(data[data$Date.Time %in% id_start, 1, drop=FALSE], 
        Duration = difftime(id_end,id_start, units='mins')) 
    return(res) 
} 
fun1(d,2) 

#    Date.Time Duration 
# 1576 2012-10-01 09:17:00 1 mins 
# 1580 2012-10-01 09:21:00 2 mins 

포인트는 여기에서주의해야 할 :

  • 당신은 data.frame을 부분 집합과시 요소 하나만 반환하면 df[, 1]을 수행하면 벡터가됩니다. df[, 1, drop = FALSE을 사용해도 안전합니다.

  • 전달 비 data.frame 인자 출력이 matrix을 당할 것이다 (즉, cbind 모든 인수 data.frames 아니다). 적어도 하나의 인수가 data.frame이 될 것으로 예상합니다. 따라서 drop = FALSE을 사용하지 않고 결과가 1 행이면 벡터가되고 결과는 행렬이됩니다 (첫 번째 점 참조)

  • 필자는 그렇게 할 필요가 없다고 생각합니다. id_startid_end에 대해서는 여기에서 paste을 사용하십시오.

  • data.framedata에 액세스하는 cbind의 첫 번째 인수는 올바르지 않습니다. Date.Time의 모든 값 내에서 id_start을 쿼리해야합니다. 그림과 같이 %in%을 사용하면됩니다.

희망이 있습니다.

+0

완벽하게 작동합니다. 내가 한 일을 볼 수 있습니다. 설명 할 수있는 기회가 있습니까? –

+0

아니요 대단히 감사합니다! –