0

Rには、4列と数千行で構成される大きなデータフレームがあります。例として最初の行を次に示します。

     ID     V1      V2     Stimulus
[1,]  001   74.80   803.0   0
[2,]  001   75.98   790.9   0
[3,]  001   75.95   791.1   0
[4,]  001   65.70   918.7   0
[5,]  001   59.63   1005.6  13
[6,]  001   59.44   1012.0  13
[7,]  001   59.62   1010.0  13
[8,]  001   63.85   942.4   13
[9,]  001   60.75   992.9   0
[10,] 001   59.62   1010.0  0
[11,] 001   61.68   974.0   0
[12,] 001   65.21   921.4   15
[13,] 001   59.23   1012.0  15
[14,] 001   61.23   979.5   15
[15,] 001   70.80   849.2   0

このデータフレームでは、各行は1秒に対応します。列4(刺激)は、0(つまり刺激なし)または0より大きい正の整数(つまり刺激数)のいずれかです。刺激数は常に1つ以上の0値で区切られます)。

列4(刺激)の各数値を前の行の値と比較する方法を学びたいです。この比較から、データフレームに5番目の列を作成し、「PRE」と記述した場合、値は0、値が変更された場合は「OK」(ただし最初の2行/秒のみ)、0とは異なる残りの数値行の場合は「POST」で、新しい0値が再度表示されます。

これは、前のデータフレームから取得したいものの例です。

         ID     V1      V2     Stimulus    Status
    [1,]  001   74.80   803.0   0           PRE
    [2,]  001   75.98   790.9   0           PRE
    [3,]  001   75.95   791.1   0           PRE
    [4,]  001   65.70   918.7   0           PRE
    [5,]  001   59.63   1005.6  13          OK
    [6,]  001   59.44   1012.0  13          OK
    [7,]  001   59.62   1010.0  13          POST
    [8,]  001   63.85   942.4   13          POST
    [9,]  001   60.75   992.9   0           PRE
    [10,] 001   59.62   1010.0  0           PRE
    [11,] 001   61.68   974.0   0           PRE
    [12,] 001   65.21   921.4   15          OK
    [13,] 001   59.23   1012.0  15          OK
    [14,] 001   61.23   979.5   15          POST
    [15,] 001   70.80   849.2   0           PRE

行7、8、および14に値「POST」があることに注意してください(値0からの変更が検出された場合、OK値は最初の2行にのみ帰属します)。

これを解決する方法がわかりません。私の考えは次のとおりです。データフレームの列4の各行をループする必要があります。各行について 、前の行よりも大きいかどうかを確認する必要があります

 mydataframe$Stimulus[i,4] >  mydataframe$Stimulus[i-1,4]

その場合、新しい列に値「OK」を追加しますが、最初の2行だけを追加し、列4(刺激)の値がゼロになるまで列5(ステータス)に値「POST」を追加します。

作成したい5番目の列は、元のデータフレームと同じ行数の別の1列のデータフレームにすることもできます。それは問題ではありません、私はそれを元のデータフレームに結合することができました

私の(理論的な)アプローチは問題ありませんか?これを達成するためのより簡単な方法はありますか?

4

1 に答える 1

2

まず、新しい列を作成します (datはデータセットの名前です)。

Status <- ave(dat[ , "Stimulus"], c(0, cumsum(abs(diff(dat[ , "Stimulus"])))),
              FUN = function(x)
                      if(!x[1]) "PRE" else c(rep("OK", min(2, length(x))),
                                             rep("POST", length(x) - 2)))

次に、両方のオブジェクトを結合します。

cbind(dat, Status)

結果:

      ID    V1     V2 Stimulus Status
[1,]   1 74.80  803.0        0    PRE
[2,]   1 75.98  790.9        0    PRE
[3,]   1 75.95  791.1        0    PRE
[4,]   1 65.70  918.7        0    PRE
[5,]   1 59.63 1005.6       13     OK
[6,]   1 59.44 1012.0       13     OK
[7,]   1 59.62 1010.0       13   POST
[8,]   1 63.85  942.4       13   POST
[9,]   1 60.75  992.9        0    PRE
[10,]  1 59.62 1010.0        0    PRE
[11,]  1 61.68  974.0        0    PRE
[12,]  1 65.21  921.4       15     OK
[13,]  1 59.23 1012.0       15     OK
[14,]  1 61.23  979.5       15   POST
[15,]  1 70.80  849.2        0    PRE
于 2013-03-05T14:13:41.897 に答える