2016-11-08 10 views
0

メッセージを書くことによってキーボードの異なるキーを押すために必要な時間間隔を計算したいと思います。行と列で行列を操作し、反復的に行を削除する

データを取得するために、テキストを書き込んだ後に.csvを生成するプログラムを使用します。この.csvには、3つの列があります。最初のキーは押して離したキー、2番目の列はキーが押された(0)か解放された(1)、最後の列に各イベントの時刻が記録されます。

次に、キーがリリースされるまで押されているため、各キーに必要な時間間隔を計算します。私たちは、キー16777248は時間5.0067901611328125e-06で押すと時間0.21875882148742676でリリースされていることを確認することができ、次の余分な簡単な例では

は、それゆえ、このキーの時間間隔は0.21875882148742676-5.0067901611328125e-06です。 72のキーの時間間隔は0.1861410140991211-0.08675289154052734である必要があります。

16777248 0 5.0067901611328125e-06 

72   0 0.08675289154052734 

72   1 0.1861410140991211 

16777248 1 0.21875882148742676 

現在のところ、私はRでコードを書いています。まず、.csvでテーブルを読み込みます。次に、2番目の列の最初の1を検索し、対応するキー名を取ります。次に、前のキーを0で検索します。時間間隔を計算し、この値をベクトルに保存して、この2つの行を行列から削除します。その後、これ以上行がなくなるまでこれを繰り返す必要があります。

対応する行が削除されているため、値myTable [x、y]がNAになることがあるという問題があります。各繰り返しで、2つの行が削除されます(押されたキーとそれに対応する解放されたキーを持つ行)。この時点で

私は次のエラーを取得する:

Error in if (myTable[j, 1] == keySearched) { : 
    missing value where TRUE/FALSE needed 

どのように私はこの問題を解決するだろうか?

+0

"対応する行がデペットされました。"これは、あなたが押されて解放されたキーと同じ数のキーを持っていないことを意味しますか?そのような場合は、欠落しているデータの処理方法を決定する必要があります。 –

+0

私はもちろん、押されてリリースされた同じ数のキーを持っています。 –

答えて

0

あなたはこのようにそれをやってみてください:

key = c(3,6,3,8,8,3,6,3) 
pressed = c(0,0,1,0,1,0,1,1) 
time = c(12,14,16,17,19,22,34,35) 
a = data.frame(key,time,pressed) 

>a 
    key time pressed 
1 3 12  0 
2 6 14  0 
3 3 16  1 
4 8 17  0 
5 8 19  1 
6 3 22  0 
7 6 34  1 
8 3 35  1 

一次データのフレーム(またはあなたが好む場合、マトリックス)、キー数と時間によります。これにより、押されたキーと解放されたキーがグループ化されます次に、差分を使って同じキー間の時間差を計算します。最後に、NAには意味をなさない差分を設定します。

a = a[order(a$key,a$time),] 
a$lapse = c(0,diff(a$time)) 
a$lapse[seq(1,nrow(a),2)] = NA 

>a 
    key time pressed lapse 
1 3 12  0 NA 
3 3 16  1  4 
6 3 22  0 NA 
8 3 35  1 13 
2 6 14  0 NA 
7 6 34  1 20 
4 8 17  0 NA 
5 8 19  1  2 
+0

素晴らしい、素晴らしい!どうもありがとうございました!! (そして、元の順序を得るためには、キーと時間で順序付けする前に、実際の順序で余分な列を作成し、最後に一度失効したら余分な列で並べ替える必要があります)。 –

関連する問題