2009-12-29 6 views
0

저는 기능 모델에서 프로그래밍 된 기능을 가지고 있으며 속도를 높이고 R 정신으로 문제를 해결하려고합니다. I data.frame을 가지고 모든 항목이 두 개의 행에 의존하는 정보를 기반으로하는 열을 추가하려고합니다.data.frame에 새 열을 추가하는 R 함수 최적화

faultFinging <- function(heartData){ 
    if(heartData$Pulse[[1]] == 0){ 
     Group <- 0 
    } 
    else{ 
     Group <- 1 
    } 
    for(i in seq(2, length(heartData$Pulse), 1)){ 
     if(heartData$Pulse[[i-1]] != 0 
      && heartData$Pulse[[i]] != 0 
      && abs(heartData$Pulse[[i-1]] - heartData$Pulse[[i]])<20){ 
      Group[[i]] <- 1 
     } 
     else{ 
      if(heartData$Pulse[[i-1]] == 0 && heartData$Pulse[[i]] != 0){ 
       Group[[i]] <- 1 
      } 
      else{ 
       Group[[i]] <- 0 
      } 
     } 
    } 
    Pulse<-heartData$Pulse 
    Time<-heartData$Time 
    return(data.frame(Time,Pulse,Group)) 
} 

답변

2

내가 샘플 데이터없이이를 테스트 할 수 없습니다, 그러나 이것은 일반적인 생각이다 는 순간 그것은 다음과 같습니다. 벡터화 된 버전 &&||&|을 사용하여 for() 루프를 완전히 수행하지 않아도됩니다. 또한 하나의 값 (true 또는 false)이있는 경우 if-else 문이 필요하지 않습니다.

faultFinging <- function(heartData){ 
    Group <- as.numeric(c(heartData$Pulse[1] != 0, 
     (heartData$Pulse[-nrow(heartData)] != 0 
     & heartData$Pulse[-1] != 0 
     & abs(heartData$Pulse[-nrow(heartData)] - heartData$Pulse[-1])<20) | 
     (heartData$Pulse[-nrow(heartData)] == 0 & heartData$Pulse[-1] != 0))) 
    return(cbind(heartData, Group)) 
} 

두 부분으로 프로그램을 분리하여 0

+0

을 제공하는'그룹 <-'as.numeric (IDX)입니다 충분한. – hadley

1

이 더 벡터 방식으로 수행 할 수 있습니다 1로 TRUE 설정합니다 인덱스 주위 as.numeric() 퍼팅 및 FALSE : 두 시간이 소요 먼저 함수

isPulse <- function(previous, current) 
{ 
    (previous != 0 & current !=0 & (abs(previous-current) < 20)) | 
    (previous == 0 & current !=0) 
} 

주 대신 부울 ||의 벡터 |의 사용 : 그들이 당신의 펄스 사양을 충족하는 경우 샘플 및 결정합니다. 다음

그리고 공급, 그것을 호출하는 두 벡터 스트림 '이전'과 '현재'귀하의 경우, 적절한 지연에 의해 상쇄, 1 :

delay <- 1 
samples = length(heartData$pulse) 

isPulse(heartData$pulse[-(samples-(1:delay))], heartData$pulse[-(1:delay)]) 

가의 몇 가지 만들어 낸 데이터를이 해 봅시다 :

sampleData = c(1,0,1,1,4,25,2,0,25,0) 
heartData = data.frame(pulse=sampleData) 
result = isPulse(heartData$pulse[-(samples-(1:delay))], heartData$pulse[-(1:delay)]) 

참고 코드 heartData$pulse[-(samples-(1:delay))] 트림 이전 스트림의 끝에서 delay 샘플, 그리고 처음부터 heartData$pulse[-(1:delay)] 트림 delay 샘플을, 현재 스트림입니다.

하는 수동으로 수행, 결과는

F,T,T,T,F,F,F,T,F 

을 (사실에 대한 허위에 대한 FT 사용)해야하고 그것을 실행하여, 우리는 그들이! :

> print(result) 
FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE 

성공 것을 발견 !

이러한 데이터를 원본 데이터 집합으로 바인딩하려면 원래 배열보다 길이가 작은 delay 요소가 있어야하므로 시작 부분에 delay FALSE 요소를 추가해야합니다. 또한 데이터에 따라 0.1으로 변환 할 수 있습니다 : idx`는 논리적이다 '때문에

resultPadded <- c(rep(FALSE,delay), result) 
heartData$result = ifelse(resultPadded, 1, 0) 

> heartData 
    pulse result 
1  1  0 
2  0  0 
3  1  1 
4  1  1 
5  4  1 
6  25  0 
7  2  0 
8  0  0 
9  25  1 
10  0  0