0

機能モデルで現在プログラムされている関数があり、それを高速化し、おそらく R の精神で問題を解決したいと考えています。data.frame があり、情報に基づいて列を追加したいと考えています。エントリは 2 つの行に依存します。現時点では、次のようになります。

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))
}
4

2 に答える 2

2

サンプル データがないとこれをテストできませんが、これが一般的な考え方です。とのベクトル化されたバージョンであるとfor()を使用することで、ループを完全に回避できます。また、値が 1 つしかない場合 (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))
}

インデックスas.numeric()を囲むと、TRUE が 1 に、FALSE が 0 に設定されます。

于 2009-12-29T15:01:43.440 に答える
1

これは、プログラムを2つの部分に分割することで、よりベクトル的な方法で実行できます。最初に、2つの時間サンプルを取得し、それらがパルス仕様を満たしているかどうかを判断する関数です。

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

|ブール値の代わりにベクトルを使用していることに注意してください||

次に、それを呼び出して、適切な遅延(この場合は1)でオフセットされた2つのベクトルストリーム「前」と「現在」を提供します。

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))]トリミングし、現在のストリームの場合は最初からサンプルをトリミングすることに注意してください。delayheartData$pulse[-(1:delay)]delay

手動で行うと、結果は次のようになります(FfalseとTtrueに使用)

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

そしてそれを実行することによって、私たちは彼らがそうであることがわかります!:

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

成功!

これらを列として元のデータセットにバインドし直すため、新しい配列はdelay元のデータよりも短い要素であることに注意する必要があります。そのため、最初に遅延FALSE要素で埋める必要があります。データに従って、0,1に変換することもできます。

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
于 2010-01-07T12:46:01.697 に答える